您的位置:首页 > 其它

超级楼梯

2017-10-17 16:33 204 查看
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

Input

输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output 对于每个测试实例,请输出不同走法的数量

Sample Input

2

2

3

Sample Output

1

2

这道题是个经典的递归推理题,也可以用dp原理解释,是互通的;

直接求第N级台阶是不可能的,那么我们来分析一下:

当N=2时,由第1级台阶到第2级台阶只有一种走法——走一步;记为a2;

当N=3时,由第1级台阶到第三级台阶有两种走法——(1)走两步,(2)走一步;记为a3;

当N=4时,可以看作由第二级台阶到第四级台阶,为a2步;或由第三级台阶到第四级台阶,为a3步;共计a2+a3步;

......

当第N级时,可以看作由第N-2级台阶到第N级,为aN-2;或由第N-1级台阶到第N级,为aN-1;共计aN-2+aN-1;

所以可以得到递归方程:F(N)=F(N-2)+F(N-1);

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#define INF 0x3f3f3f3f

using namespace std;

long long cnt[45];
void rec(int n){
cnt[1]=1;
cnt[2]=1;
for(int i=3; i<=40; i++)
cnt[i]=cnt[i-1]+cnt[i-2];
}
int main(){
int N;
cin >> N;
rec(40);
while(N--){
int M;
cin >> M;
cout << cnt[M] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: