一、动态规划基础
虽然我们在(一)中讨论过动态规划的装配线问题,但是究竟什么时候使用动态规划?那么我们就要清楚动态规划方法的最优化问题中的两个要素:最优子结构和重叠子问题。
1、最优子结构
1)如果问题的一个最优解包含了子问题的最优解,则该问题具有最优子结构。当一个问题具有最优子结构的时候,我们就可能要用到动态规划(贪心策略也是有可能适用的)。
2)寻找最优子结构时,可以遵循一种共同的模式:
a、问题的一个解可以是一个选择。例如,装配站选择问题。
b、假设对一个给定的问题,已知的是一个可以导致最优解的选择。不必关心如何确定这个选择,假定他是已知的。
c、在已知这个选择之后,要确定那些子问题会随之发生,以及如何最好的描述所的得到的子问题空间。
d、利用一种“剪贴”技术,来证明在问题的一个最优解中,使用的子问题的解本身也必须是最优的。
3)最优子结构在问题域中以两种方式变化:
a、有多少个子问题被使用在原问题的一个最优解中,以及
b、再决定一个最优解中使用那些子问题时有多少个选择
在装配线调度问题中,一个最优解只使用了一个子问题,但是,为确定一个最优解,我们必须考虑两种选择。
4)动态规划与贪心算法的区别
动态规划以自底向上的方式来利用最优子结构。也就是说,首先找到子问题的最优解,解决的子问题,然后找到问题的一个最优解。寻找问题的一个最优解需要首先在子问题中做出选择,即选择用哪一个来求解问题。问题解的代价通常是子问题的代价加上选择本身带来的开销。
在贪心算法中是以自顶向下的方式使用最优子结构。贪心算法会先做选怎,在当时看来是最优的选择,然后在求解一个结果子问题,而不是现寻找子问题的最优解,然后再做选择。
2、重叠子问题
适用于动态规划求解的最优化问题必须具有的第二个要素是子问题的空间要“很小”,也就是用来解原问题的递归算法可以反复的解同样的子问题,而不是总在产生新的子问题。典型的,不头痛的子问题数十输入规模的一个多项式,当一个递归算法不断的调用同一问题是,我们说该最优问题包含重叠子问题。
动态规划算法总是充分利用重叠子问题,即通过每个子问题只解一次,吧解保存在一个需要时就可以查看的表中,而每一次查表得时间为常数。