动态规划
基本思想
动态规划与分治法类似,其基本思想也是将求解问题分解为若干个子问题,然后从这些子问题的解得到原问题的解。与动态规划不同的是,适用于动态规划求解的问题,经分解得到的子问题往往不是相互独立的。若用分治法解此类问题,则分类得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。动态规划的解决方法就是保存子问题的答案,当需要时再次找出已求得的答案,就可以避免大量重复计算。
关键
这点是我自己的理解,可能有误。
动态规划中最关键的点是状态转移方程。状态转移方程是算法中递推的根本。针对不同的问题,状态转移方程也会有所不同,但其基本思路是将规模较大的问题往小规模问题转移。
例子
接下来一共举三个例子,分别是矩阵连乘问题,联赛胜负概率问题,以及01背包问题
矩阵连乘问题
假设计算n个矩阵的乘积, M = M 1 × M 2 × . . . × M n M=M_1\times M_2\times ...\times M_n M=M1×M2×...×Mn,设 ( p , q ) (p,q) (p,q)阶与 ( q , r ) (q,r) (q,r)阶矩阵相乘,需要计算次数为 q p r qpr qpr次乘法,因此可以看出多个矩阵相乘时,矩阵乘法的顺序对运算次数影响特别大。
设列表 M a t Mat Mat为矩阵的阶,即 ( M a t [ 0 ] , M a t [ 1 ] ) (Mat[0],Mat[1]) (Mat[0],Mat[1])为 M 1 M_1 M1的阶,同理有 ( M a t [ k − 1 ] , M a t [ k ] ) (Mat[k-1],Mat [k]) (Mat[k−1],Mat[k])为 M k M_k Mk的阶。
设 m [ i , j ] m[i,j] m[i,j]为计算 M i × M i + 1 × L × M j M_i\times M_{i+1}\times L\times M_j Mi×Mi+1×L×Mj的最小代价 ( 1 ≤ i ≤ j ≤ n ) (1\leq i\leq j\leq n) (1≤i≤j≤n),即所需的最少乘法次数。当 i < j i<j i<j时,在 i i i, j j j之间取一个 k k k,将 M i × M i + 1 × . . . × M j M_i\times M_{i+1}\times ...\times M_j Mi×Mi+1×...×Mj分为 M i × M i + 1 × . . . × M k M_i\times M_{i+1}\times ...\times M_k M