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

猜你喜欢

转载自www.cnblogs.com/Tang-tangt/p/9133650.html