第15章 动态规划 算法导论

动态规划常用来解决最优化问题,在这类问题中,我们通过做出一组选择来达到最优解。在做出每个选择的同时,通常会生成与原问题形式相同的子问题。

当多于一个选择子集都生成相同的子问题时,动态规划技术通常会很有效。

关键技术 :对每个这样的子问题都保存其解,当重复出现时即可避免重复求解。

我们通常按照如下四个步骤来设计一个动态规划算法:

1.刻画一个最优解的结构特征。

2.递归的定义最优解的值。

3.计算最优解的值,通常采用自底向上的方法。

4.利用计算的信息构造一个最优解。


适合应用动态规划方法求解的最优化问题应该具备的两个要素

1.最优子结构。

2.子问题重叠。


最优子结构:如果一个问题的最优解包含其子问题的最优解,我们就称此问题具有 最优子结构。

子问题重叠:如果递归算法反复求解相同的子问题,我们就称最优化问题具有重叠子问题。

注意:子问题应该是无关的。

子问题无关的含义是 :同一个原问题的一个子问题的解不影响另一个子问题的解。

如果一个子问题的解能影响另一个子问题的解,则由于第一个子问题的影响 我们是无法准确求解另一个子问题的,由于获得最优解两个子问题的解都要用到,显然是不正确的。

同时依赖无关性和重叠性看似很奇怪,听起来是矛盾的,但他们描述的是两个不同的概念。

一个两个子问题如果不共享资源,他们就是独立的。而重叠是指两个子问题实际上是同一个问题,只是作为不同问题的子问题出现而已。

使用动态规划求解通常有两个方法:

1.带备忘的自顶向下法。

2.自底向上法。

两种方法得到的算法具有相同的渐进运行时间,仅有的差异是在某些特殊情况下,自顶向下方法并未真正的考察所有可能的子问题。由于没有频繁的递归函数调用的开销,自底向上法的时间复杂性函数通常具有更小的系数。

你可能感兴趣的:(算法,动态规划,算法导论)