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

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;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值