#include <iostream>
#include <stdio.h>
using namespace std;
int com[100][100];
///////////////////////////////////注意这段改进的乘法结合方式输出的实现
void combine(int i, int j)
{
if(i==j)
{
printf("M%d",i);
return;
}
if(i==j-1)
{
printf("M%d*M%d",i,j);
return;
}
if(i==com[i][j])
{
combine(i,com[i][j]);
printf("*");
}
else
{
printf("(");
combine(i,com[i][j]);
printf(")*");
}
if(j==com[i][j]+1)
{
combine(com[i][j]+1,j);
}
else
{
printf("(");
combine(com[i][j]+1,j);
printf(")");
}
}
int main(int argc, char* argv[])
{
int r[100], n, m[100][100]={0},s,t,k,j,i;
printf("How many matrixes?\n");
cin>>n;
printf("How size every matrix?\n");
for(i=1;i<=n+1;++i)
cin>>r[i];
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
com[i][j]=0;
m[n][n]=0;
for(i=1;i<n;++i)
{
m[i][i]=0;
m[i][i+1]=r[i]*r[i+1]*r[i+2];
com[i][i+1]=i;
}
for(s=2;s<=n-1;++s)
for(i=1;i<n-s+1;++i)
{
j=i+s;
m[i][j]=m[i+1][j]+r[i]*r[i+1]*r[j+1];
com[i][j]=i;
for(k=i+1;k<j;k=k+1)
{
t=m[i][k]+m[k+1][j]+r[i]*r[k+1]*r[j+1];
if(t<m[i][j])
{
m[i][j]=t;
com[i][j]=k;
}
}
}
printf("最后的计算策略:");
printf("\n组合方式:");
for(i=1;i<=n;++i)
{
cout<<endl;
for(j=1;j<=n;++j)
printf("%8d",com[i][j]);
}
printf("\n最优乘法次数:");
for(i=1;i<=n;++i)
{
cout<<endl;
for(j=1;j<=n;++j)
printf("%8d",m[i][j]);
}
printf("\n乘法次数共计:%6d\n",m[1][n]);
printf("矩阵的结合方式:");
combine(1,n);
printf("\n\n");
return 1;
}