#include<iostream>
#include<string>
using namespace std;
int m[100][100];
int s[100][100];
struct Mat{
int col;
int row;
};
void matrix(int *p,int 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 trace(int i,int j)
{
if(i==j) {
char name[10];
sprintf(name,"A%d",i);
cout<<name;
return ;}
cout<<"(";
trace(i,s[i][j]);
trace(s[i][j]+1,j);
cout<<")";
}
int main()
{
int n;
cout<<"请输入矩阵的连乘的个数:";
cin>>n;
int *p=new int[n+1];
Mat *list=new Mat [n];
char name[10];
for(int i=0;i<n;i++)
{
sprintf(name,"A%d",i+1);
cout<<"请输入第"<<i+1<<"个矩阵"<<name<<"的信息"<<endl;
cout<<"请输入行数:";cin>>list[i].row;
cout<<"请输入列数:";cin>>list[i].col;
p[i+1]=list[i].col;
cout<<endl;
}
p[0]=list[0].row;
matrix(p,n+1);
cout<<"矩阵连乘最优值:"<<m[1][n]<<endl;
cout<<"最优计算次序:";
trace(1,n);
cout<<endl;
delete []p;
cin.ignore();
getchar();
return 0;
}
#include<string>
using namespace std;
int m[100][100];
int s[100][100];
struct Mat{
int col;
int row;
};
void matrix(int *p,int 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 trace(int i,int j)
{
if(i==j) {
char name[10];
sprintf(name,"A%d",i);
cout<<name;
return ;}
cout<<"(";
trace(i,s[i][j]);
trace(s[i][j]+1,j);
cout<<")";
}
int main()
{
int n;
cout<<"请输入矩阵的连乘的个数:";
cin>>n;
int *p=new int[n+1];
Mat *list=new Mat [n];
char name[10];
for(int i=0;i<n;i++)
{
sprintf(name,"A%d",i+1);
cout<<"请输入第"<<i+1<<"个矩阵"<<name<<"的信息"<<endl;
cout<<"请输入行数:";cin>>list[i].row;
cout<<"请输入列数:";cin>>list[i].col;
p[i+1]=list[i].col;
cout<<endl;
}
p[0]=list[0].row;
matrix(p,n+1);
cout<<"矩阵连乘最优值:"<<m[1][n]<<endl;
cout<<"最优计算次序:";
trace(1,n);
cout<<endl;
delete []p;
cin.ignore();
getchar();
return 0;
}