问题描述:
给定 n 个矩阵{A1,A2,…,An},其中 Ai 与 Ai+1 是可乘的,i=1,2…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
输入数据为矩阵个数和每个矩阵规模。
输出结果为计算矩阵连乘积的计算次序和最少数乘次数。
话不多说,直接上代码,代码如下:
#include <stdio.h>
#define MAX 50
int p[MAX+1];
int m[MAX][MAX];
int s[MAX][MAX];
int n;
void matrix(){
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;
}
}
}
}
void traceback(int i, int j){
if(i==j)
printf("A%d",i);
else{
printf("(");
traceback(i,s[i][j]);
traceback(s[i][j]+1,j);
printf(")");
}
}
int main(){
int i;
printf("请输入矩阵相乘的矩阵个数;\n");
scanf("%d",&n);
printf("请依次输入相邻矩阵的行数和列数:\n") ;
for(i=0;i<n+1;i++)
{
scanf("%d",&p[i]);
}
matrix();
printf("矩阵连乘最小次数为:\n%d\n",m[1][n]);
printf("矩阵的计算次序为:\n");
traceback(1,n);
printf("\n");
return 0;
}
运行结果如下:
如有更好的想法,欢迎交流。