動態規劃之矩陣鏈乘法
阿新 • • 發佈:2018-12-18
對於給定的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; }