上台阶,来自赛码网,初级动态规划算法

来源:互联网 发布:snmp trap 端口号 编辑:程序博客网 时间:2024/05/17 22:06
上台阶

题目描述

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


原创粉丝点击