#include<stdio.h>
#define MAX 50
#define inf 99999999
int p[MAX+1]; //矩阵链乘:存各矩阵的行数和最后一个矩阵的列数
int m[MAX][MAX]; //总矩阵
int s[MAX][MAX]; //存储分割点
int n; //输入矩阵的个数
void matrix(){
int i,j,k; //i是分割子矩阵的长度,j是子矩阵首段,k是分割点
for(i=0;i<n;i++)
m[i][i]=0; //当最小子问题仅含一个矩阵时,无需操作,故总矩阵对角线清零
for(i=2;i<=n;i++)
for(j=0;j<n-i+1;j++){ //n+1-i最大只能从比总矩阵链长少1的地方开始分
m[j][j+i-1]=inf; //j+i-1子矩阵首段+子矩阵长度即为子矩阵末端
for(k=0;k<i-1;k++){
if(m[j][j+i-1]>m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i]){
m[j][j+i-1]=m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i];
s[j][j+i-1]=k;//记录分割点
}
}
}
}
void printmatrix(int leftindex,int rightindex){//递归打印输出矩阵链表
if(leftindex==rightindex)
printf("A%d",leftindex);
else{
printf("(");
printmatrix(leftindex,leftindex+s[leftindex][rightindex]);
printmatrix(leftindex+s[leftindex][rightindex]+1,rightindex);
printf(")");
}
}
int main(){
int i;
printf("请输入相乘矩阵的个数:");
scanf("%d",&n);
printf("请依次输入每个矩阵的行和最后一个矩阵的列:\n");
for(i=0;i<n+1;i++){
scanf("%d",&p[i]);
}
matrix();
printf("矩阵连乘最小次数\t%d\n",m[0][n-1]);
printmatrix(0,n-1);
printf("\n");
return 0;
}
最后实现的结果是