在说动态规划的例子之前,先说明一下动态规划和分治算法的区别
虽然两者都是通过组合子问题的解来求解原问题但是分治方法将问题划分为互不相交的子问题,递归的求解子问题再将它们的解组合起来求出原问题的解。
而动态规划算法应用于子问题重叠的情况,即不同的子问题具有公共的子子问题,在这种情况下,分治算法会做许多不必要的工作,它会重复的求解这些子问题,尽管这些子问题都曾经计算过。而动态规划算法就聪明了很多,它对每个子子问题都只求解一次。将其解保存在一个数据结构中,从而遇到曾经计算过的子子问题并不是再计算而是从这个数据结构直接取结果即可。
学习动态规划算法,首先要了解最优子结构这个概念
如果一个问题的最优解包含其子问题的最优解,我们就称此问题具有最优子结构性质,一个问题如果可以应用动态规划算法,那么它必然具有最优子结构。在使用动态规划方法时,我们要利用子问题的最优解来构造原问题的最优解。
下面举一个例子,其实也是书上的例子
例子1,如何切割钢条,长度为n的钢条,可以选择切割成多段也可以选择不切割。这完全要依靠收益来看。下面这个表示长度为i的钢条所对应的价格表
长度i 1 2 3 4 5 6 7 8 9 10
价格pi 1 5 8 9 10 17 17 20 24 30
比如一个长度为4的钢条,它的切割情况就有
方案 收益
(1,3)---------- 9
(2,2)-----------10
(3,1)-----------9
(1,1,2)---------7
(1,2,1)---------7
(2,1,1)---------7
(1,1,1,1)-------4
(4,0)-----------9
这些方案中将长度为4的钢条切割成(2,2)的收益最大,于是企业就会切割了卖。。。。
首先看这个问题满足使用DP的最优子结构的性质。
我们第一次选择切割钢条的问题,剩下的钢条则是与原问题相似的子问题。
其实原问题的最优解就是由第一次切割得到的两段钢条的最优切割方案组成的,符合最优子结构。这里为了尽可能减少子问题空间的大小,切割后剩下的钢条构成一个子问题。剩下的钢条可能还会被切割,也可能不被切割,这里我们不管,我们只要求得在当前切割方案下这个子问题的最优解,与当前切割方案组合最优则能得到原问题的最优切割方案。
对于第一步的切割,你假定已经知道第一部应该如何切割得到最优解了,并且你