#include <iostream>
using namespace std;
int MatrixChain(int *p,int n,int **m,int **s)
{ 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;}
}
}
return m[1][n];
}
void traceback(int i,int j,int **s)
{
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 = 6;
int p[7] = {30,35,15,5,10,20,25};
int **m = new int*[n+1];
int **s = new int*[n+1];
for (int i = 0; i < n+1; i++)
{
m[i] = new int[n+1];
s[i] = new int[n+1];
}
int x = MatrixChain(p, n, m, s);
cout<<"最小连乘数为:"<<x<<endl;
cout<<"最优解为:"<<endl;
traceback(1, n, s);
for (int j = 0; j < n+1; j++)
{
delete[] m[j];
delete[] s[j];
}
delete[]m;
delete[]s;
return 0;
}
结果如下: