题目描述
有一个楼梯共 M 级台阶,刚开始时你在第 1 级,若每次只能跨上 1 级或 2 级,要走上第 M 级, 共有多少种走法?
输入输出格式
输入格式 首先包含一个整数 N,表示测试实例的个数,然后是 N 行数据,每行包含一个整数 M (1≤M≤40),表示楼梯的级数。 输出格式 对于每个测试实例,请输出不同走法的数量。
测试说明
Time limit 1000 ms Mem limit 32768 kB
输入输出样例
输入
2 2 3
输出
1 2
试题来源
hdu 2041
思路分析:
从第二级楼梯开始,如果你要上第二级楼梯,可以从第0级一下子上两级,也可以从先上到第一级,再上到第二级。你会发现如果这么想的话,会很乱,很麻烦。那么,本着正难则反的原则,我们从后往前看,比如说,你要上到第二级楼梯,那么你要么是从第0级上来的,要么是从第一级上来的。所以说就找到了一个递推式:
设d[n]表示上到第n级楼梯有d[n]种方法
那么,d[n]=d[n-1]+d[n-2];
有了这个递推式以后,只要找到前两项,就可以推出后面的了。
代码如下:
#include<iostream>
using namespace std;
int main()
{
long long d[51];
int i,n,T;
d[1]=0;
d[2]=1;
d[3]=2;
for(int i=4;i<=40;i++)
{
d[i]=d[i-1]+d[i-2];
}
cin>>T;
while(T--)
{
cin>>n;
cout<<d[n]<<endl;
}
return 0;
}
代码部分是先将所有的结果都找出来,然后要求谁,就输出谁。