动态规划
动态规划应用场景:
动态规划通常应用于最优化问题,即要做出一组选择以达到一个最优解。当某一个特定的子问题可能出自于多于一种选择的集合时,动态规划是很有效的;
关键技术是存储这些子问题的每一个解,以备它重复出现。
动态算法的设计可以归为如下4个步骤:
1)描述最优解的结构
2)递归定义最优解的值
3)按自底向上的方式计算最优解的值
4)由计算出的结果构造一个最优解
动态规划方法的最优化问题中的两个要素:最优化子结构和重叠子问题
最优子结构:
如果问题的一个最优解中包含了子问题的最优解(可以理解为递归定义最优解),则该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划可能会适用。(注意此时可能贪婪算法也可能适用)
寻找最优子结构遵循以下模式:
1)问题的解最终是作一个选择(选择可能为多个选择,即可能从每一个下标处分割,例如矩阵相乘,也可能为每次选择一个当前下标的数,添加到前期获得的所有子结果中,例如数组分割问题,装配线调度问题)
2)在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好地描述所得到的子问题的空间(因为递归的最终是存储子问题,所以需要考虑子问题的空间描述)。
动态规划会以自底向上的方式来利用最优子结构。即首先找到子问题的最优解,解决子问题,然后找到问题的一个最优解,而对于贪心算法,则是自顶向下的方式使用最优子结构。
如果不能应用最优子结构,则该问题肯定不能采用动态算法,例如:最短简单路径可以采用,但是最长简单路径不能采用(具体请参考神马百度)。
重叠子问题:
动态规划必须具有的第二个要素是子问题的空间要很小,也就是原来解原问题的递归算法可以反复的解同样的子问题,而不是产生新的问题(例如分治法)。 个人总体认为即是满足能够自底向上的算法方式存储重叠子问题的值,从而达到重用性。之所以问题是以指数级形式递增是因为对于重叠子问题没有存储值而进行了 重算,例如斐波那契数的递归算法。

浙公网安备 33010602011771号