版权声明:@ly https://blog.csdn.net/lytwy123/article/details/83062758
#include<iostream>
#include<cstdio>
using namespace std;
int p[101]; //存放各个矩阵的行列值,比如,矩阵A[i]的行列值为p(i-1)*p(i)
int m[101][101]; //存储存放最少数乘次数
int s[101][101]; //存储加括号的位置
void MatrixChain(int *p,int n,int m[][101],int s[][101]) //n表示有多少个矩阵
{
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;
}
}
}
}
}
void traceback(int i,int j,int s[][101])//递归矩阵连乘次序
{
if(i == j)
cout<<"A"<<i;
else if(i == j-1)
cout<<"(A"<<i<<"A"<<j<<")";
else
{
cout<<"(";
traceback(i,s[i][j],s);
traceback(s[i][j]+1,j,s);
cout<<")";
}
}
int main()
{
int n;
cin>>n;
cout<<"please input p[]:"<<endl;
for(int i = 0;i<=n;i++)
cin>>p[i];
MatrixChain(p,n,m,s);
cout<<"输出矩阵的数乘次数:"<<endl;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++){
cout<<m[i][j]<<",";
if(j == n)
cout<<endl;
}
}
cout<<"输出矩阵的加括号位置:"<<endl;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++){
cout<<s[i][j]<<",";
if(j == n)
cout<<endl;
}
}
cout<<"输出矩阵最小连乘的值:"<<endl;
cout<<m[1][n];
cout<<endl;
cout<<"矩阵最小连乘所加括号位置:"<<endl;
cout<<s[1][n];
cout<<"矩阵最小连乘表达式:"<<endl;
traceback(1,n,s);
return 0;
}