动态规划(dynamic programming)是运筹学的一个重要分支,它是解决多阶段决策问题的一种有效的数量化方法 .1957年贝尔曼发表了《动态规划》一书,标志着运筹学这一重要分支的诞生.
一般来说,适合动态规划的问题需要有两个特性。
1 优化子机构(optimal substructre)
2 重叠子问题( overlapping subproblems), 这与分治(divide -conquer)正好相反。分治总是产生新的子问题。而dp求解过的子问题结果可以在以后的计算中重复使用。
3 无后向性
dp的一个变形是备忘录方法。备忘录方法采取自顶向下的方法,dp采用自底向上的方法。
矩阵链乘(matrix chain order)问题:
给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An。
设这3个矩阵的维数分别为10×100,100×5和5×50。若按第一种加括号方式((A1A2)A3)来计算,总共需要10×100×5+10×5×50=7500次的数乘。若按第二种加括号方式(A1(A2A3))来计算,则需要的数乘次数为100×5×50+10×100×50=75000。第二种加括号方式的计算量是第一种加括号方式的计算量的10倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大影响。
对于矩阵连乘积的最优计算次序问题,设计算Ai…j ,1≤i≤j≤n,所需的最少数乘次数为m[i,j],原问题的最优值为m[1,n]。
-
当i=j时,Ai…j=Ai为单一矩阵,无需计算,因此m[i,i]=0,i=1,2,…,n ;
-
当i<j时,可利用最优子结构性质来计算m[i,j]。事实上,若计算Ai…j的最优次序在Ak和Ak+1之间断开,i≤k<j,则:m[i,j]=m[i,k]+m[k+1,j]+pi-1pkpj
-
算法按照
m[1,1]
m[2,2] m[1,2]
m[3,3] m[2,3] m[1,3]
... ... ...
m[n,n] m[n-1,n] ... .... ... m[1,n]
的顺序根据公式(2.1)计算m[i,j]。
该算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。由此可见,动态规划算法比穷举搜索法要有效得多。