小兔子喜欢蹦蹦跳跳上楼梯 ,它能一次跳1阶楼梯,也能一次跳上2阶楼梯。问小兔子要上一个n阶的楼梯,最多有多少种不同上楼的走法?
输入格式:
输入一行包含一个整数 n,表示有几阶楼梯。
输出格式:
上楼梯的走法数
输入样例:
3
输出样例:
3
这道题一眼看去很熟悉,应该是当初慧河考试的时候出过得一道编程题,,刚做了斐波那契不久,看到这道题就有了思路,网上说动态规划和分治有些类似,可能我一直都把它当分治看吧,这些算法思想我还没有系统的看过,做过题,所以可能即便用了这些思想,也说不出名字。
把每一个问题分解成更小的子问题去求解,通过子问题,去求解当前问题,省去不必要的步骤,和斐波那契一样,因为怕超时和段错误,所以就用了迭代的方式。
#include <iostream>
#include <algorithm>
using namespace std;
int kind(int n){
if(n==1)
return 1;
if(n==2)
return 2;
else{
int t1 = 1;
int t2 = 2;
int t3;
for(int i = 3;i<=n;i++){
t3 = t1 + t2;
t1 = t2;
t2 = t3;
}
return t3;
}
}
int main(){
ios::sync_with_stdio(false);
int n;
cin >> n;
cout << kind(n);
return 0;
}
方式二:代码更简洁
#include<iostream>
using namespace std;
int main(){
int n;
int a[10010]={0};
int i;
cin >> n;
a[0] = a[1] = 1;
for(i = 2;i<=n;i++)
a[i] = a[i-1] + a[i-2];
cout << a[n];
}