您的位置:首页 > 其它

20170801_动态规划之爬楼梯有多少不同的方法

2017-08-01 14:47 190 查看
20170801_动态规划之爬楼梯有多少不同的方法

问题:爬楼梯的方法有多少种方法?

N 阶楼梯上楼问题:一次可以走1阶或2阶,问有多少种上楼方式。(要求采用非递归)

输入描述:

输入包括一个整数N, (1<=N<90)。

输出描述:

直接输出方法数。

分析:

1、这是一个动态规划问题(DP问题)。需要找出状态和状态转移方程。

2、设计一个结果表 res


根据题目中的问题“问有多少种上楼方式?”,可以直接得出状态
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
;
}
}
};

int main(void)
{
int n=0;
Solution object;
long lon
4000
g res=0;
while(cin>>n)
{
res=object.climbStairs(n);
cout<<res<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐