java源代码:
package ch3.dynamic.algorithm;
public class MatrixChain {
public static Pair matrixChainOrder(int[] p){
int n=p.length-1;
int i,j,L,k,q;
int[][] m = new int[n+1][n+1];
int[][] s = new int[n+1][n+1];
for(i=0;i<=n;i++){
m[i][i]=0;
}
for(L=2;L<=n;L++){ ///L是子矩阵链的长度
for(i=1;i<=n-L+1;i++){ ///这个地方n也算是一个 eg 6-2+1=5 5,6 就是一组
j=i+L-1; ///这个地方我们可以分析得 j-L+1=i 类似于上面一行的说明解释
m[i][j]=Integer.MAX_VALUE; ///预先设置m[i][j]等于无穷大
for(k=i;k<=j-1;k++){
q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; ///用于暂时存储i-j子矩阵链中的求解的值
//由于全部加括号 那么相互之间构成括号结合的两项肯定是相互靠近在一起的两项
if(q
m[i][j]=q;
s[i][j]=k; ///分裂位置就是k加括号的位置
}
}
}
}
return Pair.make(m, s);
}
public static void printOptimalParens(int[][] s,int i,int j){
if(i==j){
System.out.printf("A%d",i);
}
else{
System.out.print("(");
printOptimalParens(s,i,s[i][j]);
printOptimalParens(s,s[i][j]+1,j);
System.out.print(")");
}
}
}