动态规划
动态规划(dynamic programming)与分治法相似,都是通过组合子问题的解来求解原问题。
动态规划方法通常来求解最优化问题。
设计动态规划算法的4个步骤:
- 刻画一个最优解的结构特征
- 递归地定义最优解的值
- 采用自底向上的方法计算最优解的值
- 利用计算出的信息构造一个最优解
适合应用动态规划方法求解的最优化问题应具备的两个要素:最优子结构和子问题重叠。
最优子结构
如果一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质。
在发掘最优子结构的性质的过程实际遵循如下通用模式:
- 证明问题最优解的第一个组成部分是是做出一个选择。做出这次选择会产生一个或多个待解的子问题。
- 对于一个给定问题,在其可能的第一步选择中,你假定已经知道了那种选择才会得到最优解。
- 给定可获得的最优解后,你确定这次选择会产生哪些子问题,以及如何最好的刻画子问空间。
- 利用“剪切—粘贴”(cut-and-paste)技术证明:作为构成原问题最优解的组成部分,每个子问题的解就会说它本身的最优解。
在动态规划方法中,我们通常自底向上地使用最优子结构,即首先求得子问题的最优解,然后求原问题的最优解。
重叠子问题
即问题的递归算法会反复地求解相同的子问题,而不是一直生成新的问题。