package com.cjs.algorithm; public class DynamicPlan { /** * 此方法用來求解矩陣連乘的最小數乘次數 * * @param p * 傳入的要連乘的矩陣的維數信息的數組 * @return String型的矩陣的最小數層次數信息 */ public static String matrixChain(int p[]) { int n = p.length - 1; //為p的實際最大下標 int m[][] = new int[n + 1][n + 1]; int s[][] = new int[n + 1][n + 1]; for (int i = 1; i <= n; i++) { m[i][i] = 0; } for (int r = 2; r <= n; r++) // r為當前計算的鏈長(子問題規模) { for (int i = 1; i <= n - r + 1; i++)// n-r+1為最后一個r鏈的前邊界 { int j = i + r - 1;// 計算前邊界為r,鏈長為r的鏈的后邊界 m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];// 將鏈ij划分為A(i) *( A[i+1:j] ) s[i][j] = i; for (int k = i + 1; k < j; k++) { // 將鏈ij划分為( A[i:k] )* (A[k+1:j]) int 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; } } } } String answer = ""; answer = answer + "此矩陣連乘所需的最小次數為:" + m[1][n] + "\n"; matrixTraceBack(1, n, s); return answer; } private static void matrixTraceBack(int i, int j, int s[][]) { if (i == j) { return; } matrixTraceBack(i, s[i][j], s); matrixTraceBack(s[i][j] + 1, j, s); int x = s[i][j] + 1; System.out.print("Multipy A" + i + "," + s[i][j]); System.out.println(" and A" + x + "," + j); } }