完全加括号的矩阵连乘积
(1)单个矩阵是完全加括号的;
(2)矩阵连乘积是完全加括号的,则可表示为2个完全加括号的矩阵连乘积和的乘积并加括号。
例题:
其中(A((BC)D))为50*10*5+(10*40*30+10*30*5)=16000.(首先BC得到10*40*30,此时(BC)相当于一个新的10*30的E),((BC)D)就相当于(ED)等于10*30*5;再将(ED)看成10*5的F;(A((BC)D))就相当于AF,50*10*5;最后将计算结果相加得到16000.
同样,(A(B(CD));先算CD=40*30*5=6000;得到40*5的E;再将(B(CD))计算,相当于BE=10*40*5=2000,得 到10*5的F;再将(A(B(CD))计算,相当于AF得到50*10*5=2500;最后将计算结果相加得到50*10*5+40*30*5+10*40*5=10500;
依次类推,得到;16000, 10500,36000, 87500, 34500
将矩阵连乘积记为A[i:j],这里i≤j
考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵
Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方式为。
计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量。
矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
2建立递归关系
n当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n
3计算最优值
4用动态规划法求最优解
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
30´35 |
35´15 |
15´5 |
5´10 |
10´20 |
20´25 |
void MatrixChain(int *p,int n,int **m,int **s) { for (int i = 1; i <= n; i++) m[i][i] = 0; for (int r = 2; r <= n; r++) for (int i = 1; i <= n - r+1; i++) { int j=i+r-1; m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j]; s[i][j] = i; for (int k = i+1; k <j; k++) { int t = m[i][k] + m[k+1][j]+ p[i-1]*p[k]*p[j]; if (t < m[i][j]) { m[i][j] = t; s[i][j] = k;} } } }