超级楼梯
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;
}
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;
}
相关文章推荐