动态规划常用来解决最优化问题,在这类问题中,我们通过做出一组选择来达到最优解。在做出每个选择的同时,通常会生成与原问题形式相同的子问题。
当多于一个选择子集都生成相同的子问题时,动态规划技术通常会很有效。
关键技术 :对每个这样的子问题都保存其解,当重复出现时即可避免重复求解。
我们通常按照如下四个步骤来设计一个动态规划算法:
1.刻画一个最优解的结构特征。
2.递归的定义最优解的值。
3.计算最优解的值,通常采用自底向上的方法。
4.利用计算的信息构造一个最优解。
适合应用动态规划方法求解的最优化问题应该具备的两个要素:
1.最优子结构。
2.子问题重叠。
最优子结构:如果一个问题的最优解包含其子问题的最优解,我们就称此问题具有 最优子结构。
子问题重叠:如果递归算法反复求解相同的子问题,我们就称最优化问题具有重叠子问题。
注意:子问题应该是无关的。
子问题无关的含义是 :同一个原问题的一个子问题的解不影响另一个子问题的解。
如果一个子问题的解能影响另一个子问题的解,则由于第一个子问题的影响 我们是无法准确求解另一个子问题的,由于获得最优解两个子问题的解都要用到,显然是不正确的。
同时依赖无关性和重叠性看似很奇怪,听起来是矛盾的,但他们描述的是两个不同的概念。
一个两个子问题如果不共享资源,他们就是独立的。而重叠是指两个子问题实际上是同一个问题,只是作为不同问题的子问题出现而已。
使用动态规划求解通常有两个方法:
1.带备忘的自顶向下法。
2.自底向上法。
两种方法得到的算法具有相同的渐进运行时间,仅有的差异是在某些特殊情况下,自顶向下方法并未真正的考察所有可能的子问题。由于没有频繁的递归函数调用的开销,自底向上法的时间复杂性函数通常具有更小的系数。