上台阶
题目描述
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
注:规定从一级到一级有0种走法。
输入
输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。
样例输入
2
2
3
输出
对于每个测试实例,请输出不同走法的数量。
样例输出
1
2
时间限制
C/C++语言:2000MS其它语言:4000MS
内存限制
题目描述
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
注:规定从一级到一级有0种走法。
输入
输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。
样例输入
2
2
3
输出
对于每个测试实例,请输出不同走法的数量。
样例输出
1
2
时间限制
C/C++语言:2000MS其它语言:4000MS
内存限制
C/C++语言:65537KB其它语言:589825KB
初级的动态规划问题,思路就是假设两种情况。
情况一:最后一步上了一个台阶,到达第i级,则走法为到达第i-1级台阶的走法。
情况二:最后一步上了两个台阶,到达第i级,则走法为到达第i-2级台阶的走法。
所以到达第i级台阶的走法为到达第i-1和i-2级台阶的走法的和。
以下算法中,我们令到达第1级的走法o1为1(此处为了计算准确,不得设置为0,原因你会明白的),令到达第2级的走法o2为1(这是肯定的,因为初始位置在第一级,到达第二级只有一种走法),令到达第3级的走法为2(自己算也是2,用第i-1级台阶走法即o1加第i-2级台阶的走法o2的和也是2)。此时开始循环,循环一次o3就等于第4级台阶的走法,循环n次o3就等于n+3级台阶的走法。当然,特要注意,循环只在输入的实例值大于等于3时有用,不满足则直接输出结果就行。
#include<iostream>
using namespace std;
int main() {
int n; //共有n个实例;
cin >> n;
while(n--) {
int get; //用户输入的实例具体值;
int o1 = 1, o2 = 1, o3 = 2; //o1,o2,o3分别代表前往第1级,第2级,第3级台阶走法个数,注意o1设置为1,是因为后面计算需要,其实第1级到1级的走法判定为1也没有问题,只是题设说明了为0;
cin >> get;
switch(get) { //判断实例值的情况,只有n>=3时才进入循环进程,否则直接输出结果;
case 1:
cout << 0 << endl;
break;
case 2:
cout << 1 << endl;
break;
default:
for(int i = 3; i < get; i++) { //一共循环了get-3次,第0次循环o3为前往3级台阶的走法个数,故循环完成后为前往get-3+3=get级台阶的走法个数;
int o4 = o3;
o3 += o2;
o1 = o2;
o2 = o4; //循环体内主要就是让o3=o1+o2,o1=o2,o2=o3原来的值;
}
cout << o3 << endl;
}
}
}