import java.io.IOException;
/**
* 题目:对于一下5个矩阵应用算法设计MATCHAIN矩阵链算法
* M1:2x3; M2:3x6; M3:6x4; M4:4x2; M5:2x7;
* (a)找出这5个矩阵相乘所需要的最少乘法运算次数(即矩阵链算法求 C[1,5])
* (b)请给出一个括弧序列表示出矩阵乘法的优先顺序;
*
* title_矩阵链算法 made by 任辉 2010-10-22
*/
public class Task7_11 {
private int[] r = { 2, 3, 6, 4, 2, 7 };//矩阵链
private int C[][];//存储三角表
private int s[][];//记录断点位置
/** 构造 */
public Task7_11() throws IOException {
System.out.print("根据本题M1:2x3,M2:3x6,M3:6x4,M4:4x2,M5:2x7/n所以");
System.out.print("矩阵链数组为:");
for (int i = 0; i < r.length; i++)
System.out.print(r[i] + ",");
System.out.println("");
System.out.println("这个矩阵链的最少乘法运算次数是:" + MATCHAIN());
printC();
printS();
System.out.printf("矩阵的结合方式:");
Traceback(1, r.length - 1, s);
// printSort();
}
/** 矩阵连算法 */
public int MATCHAIN() {
// order = new ArrayList<M>();
int i, j, d;
C = new int[r.length][r.length];
s = new int[r.length][r.length];
for (i = 1; i <= r.length - 1; i++) {
C[i][i] = 0;
}
for (d = 1; d <= r.length - 2; d++)
for (i = 1; i <= r.length - 1 - d; i++) {
j = i + d;
C[i][j] = Integer.MAX_VALUE;
for (int k = i + 1; k <= j; k++) {
C[i][j] = min(C[i][j], C[i][k - 1] + C[k][j] + r[i - 1]// r的下标注意了
* r[k - 1] * r[j]);// 太关键了,这个位置花了一个小时调试好!汗!!
s[i][j] = k;//记录断点位置
}
// order.add(new M(i, j));
}
return C[1][r.length - 1];
}
/** 二者求最小 */
public int min(int a, int b) {
if (a >= b)
return b;
else
return a;
}
/** 打印二维数组 */
public void printC() {
System.out.println("C:");
for (int i = 0; i < C.length; i++) {
for (int j = 0; j < C.length; j++) {
// if (C[i][j] < 100)
System.out.printf("%4d", C[i][j]);
// else
// System.out.print(C[i][j] + " ");
}
System.out.println("");
}
}
/** 打印断点数组 */
public void printS() {
System.out.println("s[][]:");
for (int k = 0; k < s.length; k++) {
for (int m = 0; m < s.length; m++)
System.out.printf("%3d", s[k][m]);
System.out.println("");
}
}
/** 矩阵的括弧 */
public void Traceback(int i, int j, int[][] s) {
i = i - 1;
j = j - 1;
if (i == j) {
// System.out.print("A" + (i+1));
System.out.print("M");
} else if (i + 1 == j) {
// System.out.print("(A" + (i+1) + "A" + (j+1));
System.out.print("(M " + "M");
} else {
System.out.print("(");
Traceback(i, s[i][j], s);
Traceback(s[i][j] + 1, j, s);
System.out.print(")");
}
}
public static void main(String[] args) throws IOException {
new Task7_11();
}
}