超级楼梯

来源:互联网 发布:sql server入门到精通 编辑:程序博客网 时间:2024/04/30 12:22

有一楼梯共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 0x3f3f3f3fusing 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;}



原创粉丝点击