动态规划思想与分治法很类似,都是将问题划分成若干个子问题,他们之间的区别在于:动态规划的子问题之间不是相互独立的。
-
动态规划算法的步骤:
(1)找出最优解的性质,刻画其结构特征;
(2)递归定义最优值;
(3)以自底向上的方式计算最优值;
(4)构造最优解; -
动态规划算法的两个基本要素:最优子结构和重叠子问题
-
矩阵连乘问题
问题描述:
给定n个矩阵{A1A2…An},其中Ai和Ai+1是可乘的,考察这n个矩阵的连乘积A1A2…An。由于矩阵的乘法满足结合律,故计算矩阵的连乘积有许多不同的计算次序,而不同的计算次序,所需要计算的连乘次数也是不同的,求解连乘次数最少的矩阵连乘最优次序。
举例说明矩阵结合方式对数乘次数的影响:
矩阵连乘积A1A2A3,3个矩阵的维数分别为10100,1005和550,连乘时加括号的方式有:
((A1A2)A3) 数乘次数:101005+10550=7500
(A1(A2A3)) 数乘次数:100550+10100*50=7500
(1)分析问题的最优解(刻画最优解的特征):
计算A[1,:k]和A[k+1:n]的次序是最优的,满足最优子结构性质
(2)建立递归关系(递归定义最优值):
当i=j时,m[i][j]=0;
当i<j时,m[i][j]=min{m[i][k]+m[k+1][j]+Pi-1PkPj}(i≤k<j)
(3)计算最最优值(自底向上进行):
例如,下面有6个矩阵A1,A2,……,A6.按照动态规划算法计算出m[i][j]和s[i][j]填入表中:
其中 A1:30×35 A2:35×15 A3:15×5 A4:5×10 A5:10×20 A6:20×25
令p0 = 30,p1=35,p2=15,p3=5,p4=10,p5=20,p6=25
具体的求解过程如上图所示;
时间复杂度为:O(n^3)
(4)构造最优解;
- 最长公共子序列
问题描述:
集合X={A,B,C,F,G,H,D},Y={B,C,D,A,F,H}。序列{B,C}是集合A,B的一个子序列,但它不是最长的。这里的{B,C,D}的长度为3,是X,Y的最长公共子序列。最长公共子序列问题:给定2个序列X={x1,x2,……,xm}和Y={y1,y2,……,yn},找到X,Y的最长公共子序列;
构造最优解的结构:
设序列X={x1,x2,……,xm}和Y={y1,y2,……,yn}的最长公共子序列Z={z1,z2,……,zk},则:
a、若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列;
b、若xm≠yn,且zk≠xm,则Z是Xm-1和Y的最长公共子序列;
c、若xm≠yn,且zk≠yn,则Z是X和Yn-1的最长公共子序列;
证明过程可以利用反证法证明