public class MatrixChain {
public static final int N = 6;
public static void main(String[] args) {
int[] p = new int[]{30,35,15,5,10,20,25};
int[][] m = new int[N+1][N+1];
int[][] s = new int[N+1][N+1];
MatrixChain mc = new MatrixChain();
mc.matrix_chain_order(p, m, s);
mc.print(s, 1, N);
System.out.println();
}
private void matrix_chain_order(int[] p, int[][]m, int[][]s) {
int i,j;
int n = p.length - 1;//矩阵链长度
for(i=1; i<=n; i++) m[i][i] = 0;// 初始化长度为1的链代价
for(int l=2; l<=n; l++) {// 矩阵链长度依次增加
for(i=1; i<=n-l+1; i++) {//i,j的位置在变化 保证长度是l
j = i+l-1;
m[i][j] = Integer.MAX_VALUE;//初始化m[i][j]
for(int k=i; k<=j-1; k++) {//k的位置可以从i变化到j-1
int q = m[i][k] + m[k+1][j] +p[i-1]*p[k]*p[j];
if(q < m[i][j]) {
m[i][j] = q;
s[i][j] = k;//记录最优k值
}
}
}
}
}
private void print(int[][] s, int i, int j) {
if(i == j) System.out.print("A" + i);//长度为1
else {
System.out.print("(");//左括号
print(s,i,s[i][j]);//递归以k为分割的左半边
System.out.print(" x ");//乘号
print(s,s[i][j]+1,j);//递归以k为分割的右半边
System.out.print(")");//右括号
}
}
}
最优矩阵链乘
最新推荐文章于 2020-05-21 11:18:54 发布