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

来源:互联网 发布:软件证书挂靠 编辑:程序博客网 时间:2024/06/07 09:39

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>=3if(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;}