1. 程式人生 > >動態規劃之矩陣鏈乘法

動態規劃之矩陣鏈乘法

    對於給定的n個矩陣形成的矩陣鏈M1,M2,M3,......Mn,求計算乘積M1M2M3.....Mn時進行最少次標量相乘的運算順序,這類問題就稱為矩陣鏈乘法問題。

    例: 當給定矩陣Mi的維數後,求出計算n個矩陣的乘積M1M2M3....Mn時所需標量相乘運算的最少次數。

     

       

  運用動態規劃法,對於M1M2只有一種計算方法,要p0*p1*p2次,M2M3也只有一種方法,要p1*p2*p3次,也就是MiMi-1只有一種方法,需要pi-1*pi*pi+1次乘法運算。

   接下來,如果是求M1M2M3,

                 (M1(M2M3))的成本=(M1)成本+(M2M3)成本+p0*p1*p3

                   ((M1M2)M3)的成本=(M1M2)成本+M3成本+p0*p2*p3

  一般情況下,矩陣鏈乘法(MiMi+1.....MJ)的最優解就是(MiMi+1.....Mk)(Mk+1.....Mj)的最小成本

 當i=j時為0,除此之外為 min(c[i][k]+c[k+1][j]+p[i-1]p[k]p[j],c[i][j])

     程式碼如下:

#include <iostream>
#define N 110
using namespace std;


int main()
{
    int n;
    cin>>n;
    int p[N];
    for(int i=1;i<=n;i++) cin>>p[i-1]>>p[i];
    int c[N][N];
    for(int i=1;i<=n;i++) c[i][i]=0;
    for(int l=2;l<=n;l++)    //l為物件矩陣的數量
    {
        for(int i=1;i<=n-l+1;i++)  //從Mi開始
        {
            int j=l+i-1;          
            c[i][j]=999999999;
            for(int k=i;k<=j-1;k++)     //列舉k
            {
                c[i][j]=min(c[i][j],c[i][k]+c[k+1][j]+p[i-1]*p[j]*p[k]);
            }
        }
    }
    cout<<c[1][n]<<endl;
    return 0;
}