新人求解一道C语言铺地砖问题

Leslie-Ch 2013-12-25 11:38:05
铺地砖

Time Limit:1000MS Memory Limit:65536K
Total Submit:711 Accepted:224

Description

元旦过去了,新年大酬宾活动也已经告一段落了。陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方形里。问铺满这个长方形共有多少种方法?

Input

首先输入一个整数T,表示有T组测试数据
然后是T行,每行输入1个正整数n(n<=50)

Output

对于每个n输出铺的方法种数

Sample Input


3
1
2
3

Sample Output
1
2
4


...全文
1245 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
还有多远 2013-12-25
  • 打赏
  • 举报
回复
递推就行了,注意n <= 50有可能导致结果很大,类型记得定义成long long
赵4老师 2013-12-25
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
lm_whales 2013-12-25
  • 打赏
  • 举报
回复
1)没有要求输出,每种铺法;只需要输出种数。 所以数组f,是多余的,根本没用上。也许是这个问题。 2)似乎可以迭代,假如这样的话。 时间复杂度,空间复杂度,也是问题。
derekrose 2013-12-25
  • 打赏
  • 举报
回复
引用 10 楼 s126301 的回复:
[quote=引用 9 楼 derekrose 的回复:] [quote=引用 8 楼 s126301 的回复:] [quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 s126301 的回复:] [quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样[/quote] n=3的时候 有4种排列方式 你怎么看不出来?不就是111 12 21 3 懂了吧[/quote] 111, 12, 21, 3 如果我们把3看成03, 那么f(3) = f(2)[21,111] + f(1)[12] + f(0)[03],没看出哪里错啊 f[n] = f[n-1](结尾是1) + f[n-2](结尾是2) + f[n-3](结尾是3).真心看不出哪里错啊[/quote] Woo! 对不起 看错题意了 你是对的[/quote] 你差点吓得我以后不敢回帖了[/quote] 饿。。。 为什么
s126301 2013-12-25
  • 打赏
  • 举报
回复
引用 9 楼 derekrose 的回复:
[quote=引用 8 楼 s126301 的回复:] [quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 s126301 的回复:] [quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样[/quote] n=3的时候 有4种排列方式 你怎么看不出来?不就是111 12 21 3 懂了吧[/quote] 111, 12, 21, 3 如果我们把3看成03, 那么f(3) = f(2)[21,111] + f(1)[12] + f(0)[03],没看出哪里错啊 f[n] = f[n-1](结尾是1) + f[n-2](结尾是2) + f[n-3](结尾是3).真心看不出哪里错啊[/quote] Woo! 对不起 看错题意了 你是对的[/quote] 你差点吓得我以后不敢回帖了
derekrose 2013-12-25
  • 打赏
  • 举报
回复
引用 8 楼 s126301 的回复:
[quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 s126301 的回复:] [quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样[/quote] n=3的时候 有4种排列方式 你怎么看不出来?不就是111 12 21 3 懂了吧[/quote] 111, 12, 21, 3 如果我们把3看成03, 那么f(3) = f(2)[21,111] + f(1)[12] + f(0)[03],没看出哪里错啊 f[n] = f[n-1](结尾是1) + f[n-2](结尾是2) + f[n-3](结尾是3).真心看不出哪里错啊[/quote] Woo! 对不起 看错题意了 你是对的
s126301 2013-12-25
  • 打赏
  • 举报
回复
引用 6 楼 derekrose 的回复:
[quote=引用 5 楼 s126301 的回复:] [quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样[/quote] n=3的时候 有4种排列方式 你怎么看不出来?不就是111 12 21 3 懂了吧[/quote] 111, 12, 21, 3 如果我们把3看成03, 那么f(3) = f(2)[21,111] + f(1)[12] + f(0)[03],没看出哪里错啊 f[n] = f[n-1](结尾是1) + f[n-2](结尾是2) + f[n-3](结尾是3).真心看不出哪里错啊
nice_cxf 2013-12-25
  • 打赏
  • 举报
回复
引用 6 楼 derekrose 的回复:
[quote=引用 5 楼 s126301 的回复:] [quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样[/quote] n=3的时候 有4种排列方式 你怎么看不出来?不就是111 12 21 3 懂了吧[/quote] 他前边已经把3算出来了,后续的应该没错 不过这题50可能有点太大了,long long 大概不够,需要大数了把
derekrose 2013-12-25
  • 打赏
  • 举报
回复
引用 5 楼 s126301 的回复:
[quote=引用 4 楼 derekrose 的回复:] [quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样[/quote] n=3的时候 有4种排列方式 你怎么看不出来?不就是111 12 21 3 懂了吧
s126301 2013-12-25
  • 打赏
  • 举报
回复
引用 4 楼 derekrose 的回复:
[quote=引用 3 楼 s126301 的回复:] 假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了 [/quote] 没看出来,你直接说哪里错了吧,我也是想当然觉得应该是这样
derekrose 2013-12-25
  • 打赏
  • 举报
回复
引用 3 楼 s126301 的回复:
假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过
很明显不对,你看看n=3的时候 为什么结果是4就知道你为什么错了
s126301 2013-12-25
  • 打赏
  • 举报
回复
假设f[n]是答案的话,明显f[n] = f[n-1]+f[n-2]+f[n-3], n > 3; long long f[55]; long long dfs(int n) { if(f[n]) return f[n]; if(n == 1) return f[n] = 1; if(n == 2) return f[n] = 2; if(n == 3) return f[n] = 4; return f[n] = dfs(n-1) + dfs(n-2) + dfs(n-3); } int main() { int cas,n; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%lld\n", dfs(n)); } return 0; } 手打的,没编译过

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧