zoukankan      html  css  js  c++  java
  • 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

     关于代码实现,还可以使用递归的方式。如果嫌递归方式效率低,还可以用循环。这样不需要额外定义动态规划数组浪费空间。
     
  • 相关阅读:
    路由器远程登陆的方式
    路由器上的DNS服务器构建
    路由器配置维护技巧---管道的应用
    【转】常见面试问题
    英文面试决胜关键
    12个有趣的c语言面试题
    16道嵌入式C语言面试题(经典)
    LCD 调试总结
    关于uboot的一些优化
    linux驱动开发的经典书籍
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9133650.html
Copyright © 2011-2022 走看看