20170801_动态规划之爬楼梯有多少不同的方法
问题:爬楼梯的方法有多少种方法?
N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)
输入描述:
输入包括一个整数N, (1<=N<90)。
输出描述:
直接输出方法数。
分析:
1、这是一个动态规划问题(DP问题)。需要找出状态和状态转移方程。
2、设计一个结果表 res[N]。
- 根据题目中的问题“问有多少种上楼方式?”,可以直接得出状态 res[i]。
- res[i] 表示:当有 i 层楼梯时,共有 res[i] 种方法。那么 res[i] 等于什么呢?
- 可以这样想:第一部分的最后一步是从第 i-1 层楼梯爬上第 i 层楼梯,这和 res[i-1] 一样; 第二部分的最后一步是从第 i-2 层楼梯爬上第 i 层楼梯,这和 res[i-2] 一样。
- 所以状态转移方程:res[i] = res[i-1] + res[i-2]
3、有了状态和状态转移方程,就可以编码了。
//爬楼梯的方法有多少种
// N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)
//输入描述:
//输入包括一个整数N,(1<=N<90)。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution
{
public:
long long climbStairs(int n)
{
//这是一个动态规划问题,可是使用DP算法求解
//设计一个结果表,并进行初始化
//res(i)表示楼梯有i层时的爬楼梯方法,其中res(1)=1;res(2)=2;res(3)=3.
//那么状态方程是:res(i)=res(i-1)+res(i-2) 90>i>=3
if(n<1 || n>=90)
return 0;
else
{
vector<long long> res(n+1,0);
if(n==1)
res[1]=1;
else
{
res[1]=1;
res[2]=2;
}
for(int i=3; i<=n; ++i)
{
res[i]=res[i-1]+res[i-2];
}
return res[n];
}
}
};
int main(void)
{
int n=0;
Solution object;
long long res=0;
while(cin>>n)
{
res=object.climbStairs(n);
cout<<res<<endl;
}
return 0;
}