超级楼梯

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值