动态规划 之 矩阵连乘问题

动态规划 之 矩阵连乘问题

完全加括号的矩阵连乘积

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],这里ij  

   考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵

    AkAk+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方式为

   计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]A[k+1:j]相乘的计算量。

   矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质

     计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]        

2建立递归关系

n当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n

3计算最优值

对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数最多只有
    在递归计算时,许多子问题被重复计算多次。可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。


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;}
              }
          }
}


你可能感兴趣的:(动态规划 之 矩阵连乘问题)