【算法导论】Fast-Review简记(四)动态规划
写在前面
该博文是根据《算法导论(第二版)》机械工程出版社 的主要内容(部分章节未涉及),哈工大老师授课ppt写就的,非常不全面,仅用于快速入门或复习算法。
动态规划简介
- 动态规划是解决优化问题(给定一个代价函数,在问题的解空间中搜索具有最小或最大代价的优化解)的一种常见方法
- 适用条件:
- 优化子结构:当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构。
- 重叠子问题:在问题的求解过程中,很多子问题的解将被多次使用
算法设计步骤
- 分析优化解的结构
- 分析优化子结构:优化解的子结构一定是子问题的优化解
- 重叠子问题:递归的过程中需要重复计算
- 写递归方程(假设子问题已知,关注一次递归的细节即可)
- 定义变量及其意义:将最优解的代价用数学表达式表达出来,一般就是要求的最后结果
- 定义变量之间的关系:递归地划分子问题,直至不可分,也就是初始结构
- 自底向上地求解各个子问题
- 获取构造最优解的信息:初始化的值,计算的方向
- 计算优化解的代价并保存之
- 编码
- 根据构造最优解的信息构造优化解,获取所需结果
- 如果需要,增加记录信息矩阵,递归的访问
举例:最长公共子序列
-
分析优化解的结构
- 优化子结构(证明比较多,不放了,主要思想就是反证替换法,子问题存在一个更好的优化解,则加上新条件后优于当前的优化解):
- 子问题重叠性:
- 优化子结构(证明比较多,不放了,主要思想就是反证替换法,子问题存在一个更好的优化解,则加上新条件后优于当前的优化解):
-
写递归方程
- 定义变量及其意义:最后要求LCS的长度,那就定义 C [ i , j ] C[i, j] C[i,j] 为 X 0 → i X_{0 \to i} X0→i与 Y 0 → j Y_{0 \to j} Y0→j 的LCS的长度
- 定义变量之间的关系:分别考虑刚开始,结尾和中间情况(需要分情况讨论)
-
自底向上地求解各个子问题
- 获取构造最优解的信息:初始化所有i=0,j=0的变量为0,然后自左上至右下的计算
- 计算优化解的代价并保存之
- 获取构造最优解的信息:初始化所有i=0,j=0的变量为0,然后自左上至右下的计算
-
编码
- 根据构造最优解的信息构造优化解,获取所需结果
- 如果需要,增加记录信息矩阵,递归的访问,如此找到的“LCS”是X与Y的LCS的Inverse
- 根据构造最优解的信息构造优化解,获取所需结果