【代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <stdio.h> #include <string.h> #define N 100 int m[N][N]; //m[i][j]表示从第i个矩阵连乘到第j个矩阵的最小计算次数 int s[N][N]; //第i个矩阵连乘到第j个矩阵时在何处断开,用于构造最优解 int p[N]; //表示矩阵i为p[i-1]×p[i] void MatrixChain(int n) { int i,j,k,t,r; 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; } } } } } void TraceBack(int i,int j) { if(i==j) return; TraceBack(i,s[i][j]); TraceBack(s[i][j]+1,j); printf("Multiply A%d,%d and A%d,%dn",i,s[i][j],s[i][j]+1,j); } int main() { int i,n; memset(m,0,sizeof(m)); scanf("%d",&n); for(i=0;i<=n;i++) scanf("%d",&p[i]); MatrixChain(n); printf("%dn",m[1][n]); TraceBack(1,n); return 0; } |