矩阵连乘:
设有矩阵M1,M2,M3,M4,其维数分别是10×20, 20×50, 50×1 和1×100,现要求出这4个矩阵相乘的结果。我们知道,若矩阵A的维数是p×q,矩阵B的维数是q×r,则A与B相乘后所得矩阵AB的维数是p×r。按照矩阵相乘的定义,求出矩阵AB中的一个元素需要做q次乘法(及q-1次加法)。这样,要计算出AB就需要做p×q×r次乘法。为简单起见,且由于加法比同样数量的乘法所用时间要少得多,故这里我们暂不考虑加法的计算量。由于矩阵连乘满足结合律,故计算矩阵连乘的方式可以有多种。
例如,我们可以按M1(M2(M3M4))的方式去计算,也可以按(M1(M2M3))M4的方式去计算,所得结果是相同的。但是值得注意的是,按前一方式计算需要做125,000次乘法,
而按后一方式计算只需要做2,200次乘法。由此可见,矩阵连乘的运算次序对于所需要的计算量(所需乘法次数)有着极大的影响。
如何解决矩阵连乘问题:
设要求出矩阵连乘MiMi+1……Mj-1Mj(i
按照做最后一次乘法的位置进行划分,该矩阵连乘一共可分为j-i种情况即有(j-i)种断开方式:Mi(Mi+1┅Mj),(MiMi+1)(Mi+2┅Mj),┅,(MiMi+1┅Mj-1)Mj。其中任一对括号内的矩阵个数(即规模)不超过j-i。若我们已知任一个规模不超过j-i的矩阵连乘所需的最少乘法次数,我们就可以很容易地计算出矩阵连乘MiMi+1┅Mj-1Mj(i
记第t个矩阵Mt的列数为rt,并令rt-1为矩阵Mt的行数(相邻两个矩阵,上一个矩阵的列数等于下一个矩阵的行数)。则Mi┅Mk连乘所得是ri-1×rk维矩阵,Mk+1┅Mj连乘所得是rk×rj维矩阵,故这两个矩阵相乘需要做ri-1×rk×rj次乘法。
由于在此之前我们已知任一个规模不超过j-i的矩阵连乘所需的最少乘法次数,故(Mi┅Mk)和(Mk+1┅Mj)所需的最少乘法次数已知,将它们分别记之为mi,k和mk+1,j。形为(Mi┅Mk) (Mk+1┅Mj)的矩阵连乘所需的最少乘法次数为:mi,k+ mk+1,j + ri-1×rk×rj。
对满足i≤k
矩阵连乘MiMi+1┅Mj-1Mj(i
mi,j=min { mi,k + mk+1,j + ri-1×rk×rj } (i≤k
于是在初始时我们定义mi,i=0(相当于单个矩阵的情况)
求m1,2:即i=1, j=2,就是2个矩阵,无需划分(k=1,因为i<=k
m1,2=min{ m1,1 + m2,2 + ri-1×ri×ri+1}=ri-1×ri×ri+1=r0×r1×r2= 10×20×50=10000,
求m23:即i=2, j=3,故ri-1×ri×ri+1=r1×r2×r3=20×50×1=1000,
求m13:即i=1, j=3,min(i≤k
令dp[i][j]是第i个矩阵到第j个矩阵间最小的乘法次数,p[i]表示的是第i个矩阵的列数,其行数用i-1表示。通过上面的分析,可以推导出如下状态转移方程(i<=k 比如给出的矩阵如:10×20, 20×50, 50×1 和1×100,数据格式简化为:10 20 50 1 100,其第一个数(10)表示第一个矩阵的行第二个数(20)表示第一个矩阵的列,其余的都表示当前矩阵的列。 题目来源:http://poj.org/problem?id=1651#include
参考: http://blog.sina.com.cn/s/blog_64018c250100s123.html