Reference:Introduction to Algorithms(Thrid Edition) 机械工业出版社
动态规划原理
动态规划方法通常用于求解最优化问题,即求得最优化问题的一个最优解;问题需满足两个要素:最优子结构和子问题重叠。
1、最优子结构:问题的最优解由相关子问题的最优解组合而成,而这些问题是可以独立求解的。
2、子问题重叠:如果递归算法反复求解相同的子问题,我们称最优化问题具有重叠子问题性质,不同的子问题具有公共的子子问题;。与动态规划相对的分治算法是将问题划分为互不相交的子问题,递归地求解,然后再组合起来,对于子问题重叠,分治算法会做许多不必要的工作,重复求解公共子问题。
我们通常用四个步骤设计一个动态规划算法:
1.刻画一个最优解的结构特征
2.递归地定义最优解的值
3.计算最优解的值,通常采用自底向上的方法
4.利用计算出来的信息构造最优解
效率
对于朴素的递归算法,之所以效率低下,是因为它反复求解相同的子问题,因此动态规划方法仔细安排求解顺序,对每个子问题只求解一次,并将结果保存下来,若随后再次需要此问题的解,只需要查找保存的结果,而不必重新计算,这付出了额外的内存空间的代价,是时空权衡(time-memory trade-off)的例子。
实现方法
动态规划有两种等价的实现方法:带备忘的自顶向下和自底向上法
1 top-down whth momoization:次方法按自然的递归形式编写过程,但过程会保存每个子问题的解,当需要一个子问题的解的时候,通常是先检查是否已经保存过此解,如果是,就返回对应的值,否则按照通常的方式计算这个子问题。
2 bottom-up method :这种方法一般需要恰当定义子问题规模的概念,是的任何子问题的求解都只依赖于更小的子问题的解。因而我们可以将子问题按规模排序,按小至到的顺序进行求解。当求解某个子问题时,它所依赖的更小的子问题都已经求解完毕。
这篇小结一下理论,第二,三和第四篇将用钢条切割,矩阵链乘法和LCS问题来诠释理论,然后再写一篇来总结,求不偷懒,每天一篇。。done
Aug 31