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
| public class Solution {
public static void main(String[] args) { int[] p = {30, 35, 15, 5, 10, 20, 25}; int n = p.length - 1; int[][] s = new int[n + 1][n + 1]; Solution solution = new Solution(); int x = solution.matrixChain(p, s, 0, n); System.out.println("---------------s[i][j]-----------------"); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { System.out.printf("%6d", s[i][j]); } System.out.println(); } System.out.println("最优值:" + x); System.out.println("---------------最优解-----------------"); solution.traceback(1, n, s); System.out.println("计算次数:" + solution.count);
}
public int count = 0;
public void traceback(int i, int j, int[][] s) { if (i == j) return; traceback (i, s[i][j], s); traceback (s[i][j] + 1, j, s); System.out.print ("Multiply A[" + i + "][" + s[i][j] + "]"); System.out.println (" and A[" + (s[i][j] + 1) + "][" + j + "]"); }
public int matrixChain (int[] p, int[][] s, int left, int right) { if (left + 1 >= right) return 0; int i = left + 1; int min = matrixChain (p, s, left, i) + matrixChain (p, s, i, right) + p[left] * p[i] * p[right]; count++; int minIndex = i; for (i = left + 2; i < right; i++) { int t = matrixChain (p, s, left, i) + matrixChain (p, s, i, right) + p[left] * p[i] * p[right]; count++; if (t < min) { min = t; minIndex = i; } } s[left + 1][right] = minIndex; return min; }
}
|