动态规划是通过组合子问题的解而解决整个问题的。和分治法的区别在于:分治法算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解。与此不同,动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题,动态规划算法是对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。
动态规划常用于最优化问题。此类问题可能有很多种可行解。每个解有一个值,而我们希望找出一个具有最优(最大或最小)值的解。
动态规划算法的设计可以分为如下4个步骤:
1、描述最优解的结构。
2、递归定义最优解的值。
3、按自底向上的方式计算最优解的值。
4、由计算出的结果构造一个最优解。
动态规划的最优子结构:一个问题的最优解包含了子问题的一个最优解。
是否可以采用动态规划的两个标志:1、最优子结构 2、子问题重叠
在找寻最优子结构时,可以遵循一种共同的模式:
1、问题的一个解可以是做一个选择。例如,选择一个前一个装配线装配站;或者选择一个下标以在该位置分裂矩阵链。做这种选择会得到一个或多个有待解决的子问题。
2、假设对一个给定的问题,已知的是一个可以导致最优解的选择。
3、在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好地描述所得到的的子问题空间。
4、利用一种“剪贴”技术,来证明在问题的一个最优解中,使用的子问题的解本身也必须是最优的。通过假设每一个子问题的解都不是最优解,然后导出矛盾。
未完待续。。。