第五版算法设计与分析 动态规划(含书上与leetcode习题)

动态规划关键要点

(1) 基本要素 + V.S. 递归

动态规划和递归类似,基本思想也是:先分解再求解子问题。但动态规划中的子问题往往不独立,如果使用递归,则将出现许多重复运行,时间复杂度往往指数级。动态规划法使用一个表来记录子问题的解,后续使用时查询即可。

因此,一个动态规划问题包含两个基本要素:

  • 最优子结构:问题的解可由他的子问题的解来确定,要想达到当前状态的最优解,则子问题的解也应该是最优的,即全局最优解包含局部最优解。
  • 重叠子问题:每次产生的子问题并不总是新问题。

(2)备忘录方法

备忘录方法是动态规划的变形。但与动态规划不同的是,备忘录是自顶向上的(即动态规划先求子问题,再求大问题,备忘录方法与之相反)。与动态规划相同的是,他也为每个子问题建立记录项。

二者方法优劣在于子问题重叠情况,若重叠多,则动态规划更佳,否则备忘录更佳。这是由于后者仅计算需要求解的子问题。

(3) 求解步骤

寻找最优子结构的结构特征 → 表示成子问题的最优解 → 自底向上计算出最优值 → 构造最优解

  1. 寻找最优子结构的性质、结构特征;
  2. 表示成子问题的最优解,并递归定义;
  3. 自底向上计算出最优值;
  4. 构造最优解。

另:通常可以通过观察特殊结构等,来减少使用空间。一般难点在于第一点,需要多实践摸索经验。

习题

(1)书:最长公共子序列

给定两个字符串,确定他们最长公共子序列(子序列为原序列中部分下标严格递增的序列)。

1.1 最优子结构 特征性质

我觉得对于初学者而言,这一题的难点在于如何去定义最优解,定义最优解的子问题变化。一个直接的认知是,最优子结构是根据两个字符串的长度变化而改变的,我们就可以设定两个字符串的求解位置作为两个变量。

接着,我们可以得到子结构的变化特征:

X = { x 1 , x 2 , . . . , x m } , Y = { y 1 , y 2 , . . . , y n } X = \{x_1,x_2, ..., x_m \}, Y=\{ y_1, y_2, ..., y_n\} X={ x1,x2,...,xm},Y={ y1,y2,...,yn},最长公共子序列 Z = { z 1 , . . . , z k } , 则 有 : Z=\{z_1, ..., z_k\},则有: Z={ z1,...,zk}

  1. x m = y n x_m=y_n x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值