• 动态规划笔记


    动态规划专题

    思路:

    利用历史记录来避免重复计算,这些历史记录需要用变量来保存

    一般利用一维数组或者二维数组

    步骤

    1. 定义数组元素的含义

    2. 找到数组元素之间的关系式

      1. 递推式子

      例如
      f(n) = f(n-1)+f(n-2)

    3. 初始值

      1. 类似递推公式当中的初始值

    例子

    ⼆、案例详解
    案例⼀、简单的⼀维DP
    问题描述:⼀只⻘蛙⼀次可以跳上1级台阶,也可以跳上2级。求该⻘蛙跳上⼀个n级的台阶总共有
    多少种跳法。
    (1)、定义数组元素的含义
    按我上⾯的步骤说的,⾸先我们来定义dp[i] 的含义,我们的问题是要求⻘蛙跳上n 级的台阶总共由多
    少种跳法,那我们就定义dp[i] 的含义为:跳上⼀个i 级的台阶总共有dp[i] 种跳法。这样,如果我们能
    够算出dp[n],不就是我们要求的答案吗?所以第⼀步定义完成。
    (2)、找出数组元素间的关系式
    我们的⽬的是要求dp[n],动态规划的题,如你们经常听说的那样,就是把⼀个规模⽐较⼤的问题分成
    ⼏个规模⽐较⼩的问题,然后由⼩的问题推导出⼤的问题。也就是说,dp[n] 的规模为n,⽐它规模⼩
    的是n-1, n-2, n-3.... 也就是说,dp[n] ⼀定会和dp[n-1], dp[n-2]....存在某种关系的。我们要找出他们
    的关系。
    那么问题来了,怎么找?
    这个怎么找,是最核⼼最难的⼀个,我们必须回到问题本身来了,来寻找他们的关系式,dp[n] 究竟会
    等于什么呢?
    对于这道题,由于情况可以选择跳⼀级,也可以选择跳两级,所以⻘蛙到达第n 级的台阶有两种⽅式
    ⼀种是从第n-1 级跳上来
    ⼀种是从第n-2 级跳上来
    由于我们是要算所有可能的跳法的,所以有dp[n] = dp[n-1] + dp[n-2]。
    (3)、找出初始条件
    当n = 1 时,dp[1] = dp[0] + dp[-1],⽽我们是数组是不允许下标为负数的,所以对于dp[1],我们必须
    要直接给出它的数值,相当于初始值,显然,dp[1] = 1。⼀样,dp[0] = 0.(因为0 个台阶,那肯定是
    0 种跳法了)。于是得出初始值:
    dp[0] = 0. dp[1] = 1. 即n <= 1 时,dp[n] = n.
    三个步骤都做出来了,那么我们就来写代码吧,代码会详细注释滴。
    

    总结

    填表过程,记住当前二维数组的意义以及原来数组中的当前位置的意义

  • 相关阅读:
    Hadoop 文件系统命令行基础
    Mac bash 远程连接阿里云服务器
    Master in Vocab -- Day Six
    Master in Vocab -- Day Five
    Master in Vocab -- Day Four
    Master in Vocab -- Day Three
    mybatis学习一
    mysql事务,视图,权限管理,索引,存储引擎(胖胖老师)
    SpringAOP
    Spring事务
  • 原文地址:https://www.cnblogs.com/albertshine/p/13616813.html
Copyright © 2020-2023  润新知