超级楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26862 Accepted Submission(s): 13830
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
2
2
3
Sample Output
1
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26862 Accepted Submission(s): 13830
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
2
2
3
Sample Output
1
2
好吧,第一反应,递归,看到M最大才40,
于是,果断TLE,%>_<%!
悲剧吧。。。。我还是太嫩太菜啊。。。
后来算了前5组数据,发现是斐波那契数列。。。
于是,又交WA!!( ⊙ o ⊙ )啊!
难道不是么?又想:难道是边算边打表?
就是递归+打表, 先给到前3个台阶赋值,
然后,i从4开始递归,如果传进函数的值对应的数组不为0,则返回数组内的值,
结果又WA。。。无奈了
最后发现,是我初始值赋错了,
我在本上写的1,2,3。。代表的是 中间差的台阶,我当成到第一个台阶,第二个台阶。。
改完了,交,果断AC啊。。。
好吧,我太粗心了,这个问题真不该发生啊!
// 超级楼梯
#include <iostream>
using namespace std;
int lt[43];
int main()
{
int n,m,i;
lt[1]=0;
lt[2]=1;
lt[3]=2;
for(i=4;i<=42;++i)
lt[i]=lt[i-1]+lt[i-2];
cin>>n;
while(n--)
{
cin>>m;
cout<<lt[m]<<endl;
}
return 0;
}
这个是用递归+打表做的
// 超级楼梯
#include <iostream>
using namespace std;
int lt[43];
int search(int n)
{
if(lt[n]!=0)
return lt[n];
return search(n-1)+search(n-2);
}
int main()
{
int n,m,i;
lt[1]=0;
lt[2]=1;
lt[3]=2;
for(i=4;i<=42;++i)
lt[i]=search(i);
cin>>n;
while(n--)
{
cin>>m;
cout<<lt[m]<<endl;
}
return 0;
}