问题
思路:
/*矩阵A i行j列 ;矩阵B j行s列 AB 计算量i*j*s
*/
#include<stdio.h>
int n;
int p[100];
int m[100][100];
int s[100][100];
void matrixchain();
void print(int i,int j);
int main(){
int i;
printf("输入矩阵数\n"); //n为矩阵个数
scanf("%d",&n);
printf("输入每个矩阵的行数和列数\n");
for(i=0;i<=n;i++){
scanf("%d",&p[i]);
}
matrixchain();
print(1,n);
printf("最小计算量的值:%d\n",m[1][n]);
return 0;
}
void matrixchain(){
int r,i,j,k,t;
for(r=2;r<=n;r++){ //r链长
for(i=1;i<=n-r+1;i++){ //i左边界
j=i+r-1; //j右边界
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i; //记录k
for(k=i+1;k<j;k++){ //遍历所有划分
// k的位置为最优划分,即最后一次相乘,A[i...j]=A[i...k]*A[k+1...j]
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 print(int i,int j){
if(i==j){
printf("A[%d]",i);
return;
}
printf("(");
print(i,s[i][j]); //A[i...k]
print(s[i][j]+1,j); //A[k+1...j]
printf(")");
}