101 爬楼梯

原题网址:https://www.lintcode.com/problem/climbing-stairs/description

描述

假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?

您在真实的面试中是否遇到过这个题?  

样例

比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法

返回 3

标签
动态规划(DP)
 
思路:这道题也是用动态规划的方法来解,但区别于数字三角形和最小路径和,此题的状态转移方程没有那么明显。
 
为了梳理思路,先列举几个n 为小数值的解。
 
n = 1,只有一种解法;
n = 2,有 1+1 = 2,2 = 2,两种解法;
n = 3,有 1+1+1 = 3,1+2 = 3,2+1 =3 三种解法;
n = 4,有 1+1+1+1 = 4,1+1+2 = 4,1+2+1 = 4,2+1+1 = 4,2+2 = 4 五种解法;
n = 5,有 1+1+1+1+1 = 5,1+1+1+2 = 5,1+1+2+1 = 5,1+2+1+1 = 5,2+1+1+1 = 5, 1+2+2 = 5, 2+1+2 = 5, 2+2+1 = 5 八种解法;
n = 6,同理,有13种解法,这里不再罗列。
 
通过观察可以发现,当 n >= 3 时,n 解法个数 = n-1个数 + n-2个数。
 
所以可以定义一个一维数组dp【n】,初始dp【0】=1,dp【1】=2。
状态转移方程为 dp【i】= dp【i-1】+ dp【i-2】。
最后return dp【n-1】。
 
AC代码:
class Solution {
public:
    /**
     * @param n: An integer
     * @return: An integer
     */
    int climbStairs(int n) {
        // write your code here
        if (n<=0)
    {
        return 0;
    }
    if (n==1)
    {
        return 1;
    }
    vector<int> dp(n,0);
    dp[0]=1;
    dp[1]=2;
    for (int i=2;i<n;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n-1];
    }
};

 蠢了,理解爬楼梯问题还有更直接的方式。

n=1,一种;

n=2,两种;

n=3,三种;(要么从第1级迈上来,要么从第2级迈上来)

n=4,五种;(要么从第2级迈上来,要么从第3级迈上来)

……

n=i,要么从第 i -1 级迈上来,要么从第 i-2 级迈上来。

所以状态转移方程一目了然,dp【i】= dp【i-1】+ dp【i-2】。

参考:https://blog.csdn.net/Sunny_Ran/article/details/49722333    与    https://blog.csdn.net/ouyangjinbin/article/details/51083767

 关于代码实现,还可以使用递归的方式。如果嫌递归方式效率低,还可以用循环。这样不需要额外定义动态规划数组浪费空间。
 
posted @ 2018-06-04 15:39  eeeeeeee鹅  阅读(176)  评论(0)    收藏  举报