【实验名称】
矩阵链相乘问题
【实验内容与要求】
用动态规划策略求矩阵链相乘的最小乘法次数及乘法方式
【实验类型】
验证型
【实验思路】
建立一个n*n的表,先将对角线d0填充0,然后利用公式
C[i][j]=min{C[i][j],(C[i][k-1]+C[k][j]+M[i][0]*M[k][0]*M[j][1])}
依次填充d1到dn-1,并记录下对应的k值,最后输出C[1,n]的结果。
【实验代码】
#include
using namespace std;
int main()
{
int n;
cin>>n;
int M[n+1][2];
for(int i=1;i<=n;i++)
{
cin>>M[i][0]>>M[i][1];
}
int C[n+1][n+1],K[n+1][n+1];
for(int i=1;i<=n;i++)
{
C[i][i]=0;
}
for(int d=1;d<n;d++)
{
for(int i=1;i<=n-d;i++)
{
int j=i+d;
C[i][j]=99999999;
for(int k=i+1;k<=j;k++)
{
C[i][j]=C[i][j]<(C[i][k-1]+C[k][j]+M[i][0]*M[k][0]*M[j][1])?C[i][j]:(C[i][k-1]+C[k][j]+M[i][0]*M[k][0]*M[j][1]);
K[i][j]=C[i][j]<(C[i][k-1]+C[k][j]+M[i][0]*M[k][0]*M[j][1])?k-1:k;
}
}
}
cout<<“最小乘法次数:”<<C[1][n]<<endl;
cout<<“此时k=”<<K[1][n]<<endl;
return 0;
}