目录
动态规划关键要点
(1) 基本要素 + V.S. 递归
动态规划和递归类似,基本思想也是:先分解再求解子问题。但动态规划中的子问题往往不独立,如果使用递归,则将出现许多重复运行,时间复杂度往往指数级。动态规划法使用一个表来记录子问题的解,后续使用时查询即可。
因此,一个动态规划问题包含两个基本要素:
- 最优子结构:问题的解可由他的子问题的解来确定,要想达到当前状态的最优解,则子问题的解也应该是最优的,即全局最优解包含局部最优解。
- 重叠子问题:每次产生的子问题并不总是新问题。
(2)备忘录方法
备忘录方法是动态规划的变形。但与动态规划不同的是,备忘录是自顶向上的(即动态规划先求子问题,再求大问题,备忘录方法与之相反)。与动态规划相同的是,他也为每个子问题建立记录项。
二者方法优劣在于子问题重叠情况,若重叠多,则动态规划更佳,否则备忘录更佳。这是由于后者仅计算需要求解的子问题。
(3) 求解步骤
寻找最优子结构的结构特征 → 表示成子问题的最优解 → 自底向上计算出最优值 → 构造最优解
- 寻找最优子结构的性质、结构特征;
- 表示成子问题的最优解,并递归定义;
- 自底向上计算出最优值;
- 构造最优解。
另:通常可以通过观察特殊结构等,来减少使用空间。一般难点在于第一点,需要多实践摸索经验。
习题
(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},则有:
- 若 x m = y n x_m=y_n x