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