#include<iostream>
#include<time.h>
using namespace std;
void Traceback(int i,int j,int **s);
int maxnum(int a, int b) {
return a>b?a:b;
}
int maxchainorder(int *p, int n) {
int **m=new int *[n];
for(int i=0;i<n;i++)
m[i]=new int[n];
int **s=new int *[n];
for(int i=0;i<n;i++)
s[i]=new int[n];
for(int i=0;i<n;i++)
m[i][i]=0;
for(int l=1;l<n;l++) {
for(int i=0;i<n-l;i++) {
int j=i+l;
m[i][j]=m[i][i]+m[i+1][j]+p[i]*p[i+1]*p[j+1];
s[i][j]=i;
for(int k=i+1;k<j;k++) {
int q=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
if(q<m[i][j]) {
m[i][j]=q;
s[i][j]=k;
}
}
}
}
int res=m[0][n-1];
Traceback(0,n-1,s);
for(int i=0;i<n;i++)
delete []m[i];
delete []m;
for(int i=0;i<n;i++)
delete []s[i];
delete []s;
return res;
}
void Traceback(int i,int j,int **s) {
if(i==j)return;
Traceback(i,s[i][j],s);//递归打印A[i:s[i][j]]的加括号方式
Traceback(s[i][j]+1,j,s);//递归打印A[s[i][j]+1:j]的加括号方式
cout<<"A"<<i<<"和A"<<(s[i][j]+1)<<"相乘"<<endl;
}
int main() {
clock_t start,end;
int p[7]={30,35,15,5,10,20,25};
start=clock();
cout<<maxchainorder(p,6)<<endl;
end=clock();
cout<<(end-start)<<endl;
system("pause");
return 0;
}
矩阵链乘积——c++
最新推荐文章于 2023-06-30 16:06:30 发布