矩阵连乘(动态规划)
1. 问题描述
给定 n 个矩阵{A1,A2,…,An},其中 Ai 与 Ai+1 是可乘的,i=1,2 ,…,n-1。如何确定计算矩
阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
2.
2.1 问题分析
将矩阵连乘积简记为 A[i:j] ,这里 i≤j
考察计算 A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak 和 Ak+1 之间将矩阵链断开,
i≤k
m[i][j]=0;
s[i][j]=0;
}
printf("矩阵的下标为:\n");
for(i=0;i<7;i++)
scanf("%d",&p[i]);
matrixChain(p,m,s);
printf("The best sequence:\n");
for(i=1;i<=6;i++)
{
for(j=1;j<=6;j++)
printf("%8d",m[i][j]);
printf("\n");
}
printf("\n");
for(i=1;i<=6;i++)
{
for(j=1;j<=6;j++)
printf("%8d",s[i][j]);
printf("\n");
{
}
{
}
void matrixChain(int p[7], int m[7][7], int s[7][7])
int n=6,i,j,r,k,t;
for ( i = 1; i <= n; i++) m[i][i] = 0;
for ( r = 2; r <= n; r++)
for ( i = 1; i <= n - r+1; i++)
{
j=i+r-1;
m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];
s[i][j] = i;
for ( k = i+1; k < j; k++)
{
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;}
}
}
}
4. 运行结果
5. 心得体会
代码实现时要注意的问题:计算问题!!
因为你要保证在计算 m[i][j]查找 m[i][k]和 m[k+1][j]的时候,m[i][k]和 m[k+1][j]
已经计算出来了。