对于给定的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)的最小成本
定义二维数组m[i][j] 表示(MiMi+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;
}