问题描述:
假设你现在正在爬楼梯,楼梯有 n 级。每次你只能爬 1 级或者 2 级,那么你有多少种方法爬到楼梯的顶部?
输入格式
第一行输入一个整数 n(1≤n≤50),代表楼梯的级数。
输出格式
输出爬到楼梯顶部的方法总数。
样例输入
5
样例输出
8
C++代码描述
分析:模仿斐波那契数,假设从底走到第n级的走法有f(n)种,走到第n级有两个方法,一个是从(n-1)级走一步,另一个是从第(n-2)级走两步,前者有f(n-1)种方法,后者有f(n-2)种方法,所以有f(n)=f(n-1)+f(n-2),还有f(0)=1,f(1)=1. f(2)=2
具体实现:
方法一重新定义了一个大数,防止越界
#include <iostream>
using namespace std;
typedef long long L;
L a[55];
int main()
{
int n;
cin>>n;
a[0]=0;
a[1]=1;
a[2]=2;
for(int i = 3;i <= n;i++)
{
a[i] = a[i-1] + a[i-2];
}
cout<< a[n]<<endl;
return 0;
}
方法二:动态规划
分析:在递归思想的基础下,我们知道存在子问题求解的重复性,运用动规,只需要将子问题求解一次,以后再遇到,直接调用,所以我们新建一个数组用于存储子问题的结果:
#include<iostream>
using namespace std;
int result[100];
int f(int n) {
int res;
if(result[n]>0) //如果大于零,说明该子问题原来已经求过解
return result[n]; //直接返回对应的数组元素
if(n==0 || n==1)
res=1;
else
res=f(n-1)+f(n-2);
result[n]=res; //每次都将求过解的子问题赋给对应数组元素
return res;
}
int main() {
int i, n;
cin >> n;
for(i=0;i<=n;i++)
result[i]=-1;
cout << f(n);
return 0;
}