#include<iostream>
using namespace std;
class MatrixChain //矩阵连乘类
{
public:
MatrixChain(int mSize,int *q); //构造函数
int MChain(); //动态规划法求最优解值
int LookupChain(); //备忘录法求最优解值
void Traceback(); //构造最优解的公有函数
void Output();
void Initialise();
private:
void Traceback(int i,int j);
int LookupChain(int i,int j);
int *p,**m,**s,n; //数据成员
};
MatrixChain::MatrixChain(int mSize,int *q) //构造函数,初始化数组p,m,s
{
int i;
n=mSize; //初始化n,矩阵数
p=new int[n+1]; //为维数数组申请空间
for(i=0;i<n+1;i++)
{
p[i]=q[i]; //初始化数组p[]
}
m=new int*[n]; //以下是为数组m,s申请空间
s=new int*[n];
for(i=0;i<n;i++)
{
m[i]=new int[n];
s[i]=new int[n];
}
}
void MatrixChain::Initialise() //将数组s,m置零
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
s[i][j]=m[i][j]=0;
}
}
int MatrixChain::MChain() //动态规划法求解最优解值
{//求A[0:n-1] 的最优解值
int i,j,r,k;
for (i=0;i<n;i++) //单一矩阵不用计算
{
m[i][i]=0;
s[i][i]=0;
}
for (r=2;r<=n;r++) //当i<j时
{
for(i=0;i<=n-r;i++)
{
j=i+r-1;
m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]; //省略了m[i][i]=0项
s[i][j]=i; //先赋值,再更新
for(k=i+1;k<j;k++) //i~j,k为中断位置