zoukankan      html  css  js  c++  java
  • 爬楼梯-动态规划

    假设你正在爬楼梯.需要n阶你才能到达.

    每次你可以爬1或者2个台阶.你有多少种不同的方法可以爬到楼顶呢?

    注意: 给定n是一个正整数.

    示例1:

    输入: 2
    输出: 2
    解释: 有两种方法可以爬到楼顶。
    1.  1 阶 + 12.  2

    示例2:

    输入: 3
    输出: 3
    解释: 有三种方法可以爬到楼顶。
    1.  1 阶 + 1 阶 + 12.  1 阶 + 23.  2 阶 + 1

    解法一: 动态规划

    先不讲思想之类的,先看n值不断变化的时候,有什么规律吗?,用result记录多种可能性

    1. 当n = 0 ,result = 0;
    2. 当n = 1, result = 1;
    3. 当n = 2, result = 2;
    4. 当n = 3, result = 3;
    5. 当n = 4, result = 5……

    通过上面我们发现规律如下:

    思想

    下面我们谈思想,不难发现,这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效的构建,可以用动态规划来解决这一问题.

    第 i 阶可以由以下两种方法得到:

    1. 在第(i - 1)阶后向上爬一阶
    2. 在第(i - 2)阶后向上爬两阶

    所以到达第 i 阶的方法总数就是第 (i - 1) 和第 (i - 2)阶的方法数之和.

    令dp[ i ] 表示能到达第 i 阶的方法总数:

    dp[ i ] = dp[i - 1] + dp[i - 2]

    代码

    func climbStairs(_ n: Int) -> Int {
            guard n > 0 else {return 0}
        if n == 1 {
            return 1
        }
        var dp: [Int] = [Int]()
        dp.append(0) //第一个元素,当n = 0,不存在方式爬到楼上
        dp.append(1) //第2个元素,当n = 1, 1种方式
        dp.append(2) //第3个元素,当n = 2, 2种方式
        for i in 3..<n + 1 {
            dp.append(dp[i - 1] + dp[i - 2]) //用append不如用=赋值
        }
        return dp[n]
        }

    结果

    上面就是动态规划的思想做,以后有其他思想做此题目,会更新最新的思想和代码(因本阶段专注动态规划解法).

  • 相关阅读:
    JSP第六次作业
    JSP第五次作业
    第二次软件测试作业
    JSP第四次作业(2)
    JSP第四次作业(1)
    JSP第七次作业
    JSP第六次作业
    session对象练习
    JSP第四次作业(2)
    JSP第四次作业(1)
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11796576.html
Copyright © 2011-2022 走看看