动态规划笔记

动态规划专题

思路:

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

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

步骤

  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.
三个步骤都做出来了,那么我们就来写代码吧,代码会详细注释滴。

总结

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

posted @ 2020-09-05 00:12  ASini  阅读(140)  评论(0编辑  收藏  举报