做好充足的准备,你才能在机会到来时狠狠的抓住它!Come on!
#include <cstdio>
#include <cstring>
const int INF=100;
int m[INF][INF],s[INF][INF],p[INF];
// m[i][j]表示从第i个矩阵到第j个矩阵连乘需要进行乘法计算的次数
// s[i][j]=k 表示:m[i][j]最小时,应先计算第ige矩阵到第k个矩阵的乘积,
//再计算第k+1个矩阵到第j个矩阵的乘积,然后在计算所得两个矩阵的乘积
//p[i-1]记录的是第i个矩阵的行数,p[i]记录的是第i个矩阵的列数
void MatrixChain(int n)
{
for(int i=0;i<=n;i++)
m[i][i]=s[i][i]=0;
for(int k=2;k<=n;k++) //k表示连乘的矩阵的个数
{
for(int i=1;i<=n-k+1;i++)
{
int j=i+k-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int t=i+1;t<j;t++)
{
int temp=m[i][t]+m[t+1][j]+p[i-1]*p[t]*p[j];
if(temp<m[i][j])
{
m[i][j]=temp;
s[i][j]=t;
}
}
}
}
}
void Traceback(int i,int j)
{
if(i==j) return;
Traceback(i,s[i][j]);
Traceback(s[i][j]+1,j);
printf("A[%d:%d]*A[%d:%d]\n",i,s[i][j],s[i][j]+1,j);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<=n;i++)
scanf("%d",&p[i]);
MatrixChain(n);
Traceback(1,n);
}
return 0;
}