书上的例子,加回溯求出加()结果。
import java.util.ArrayList;
import java.util.stream.Collectors;
public class MatrixChain {
int matrixChain(int[] p) {
int n = p.length - 1;
int[][] m = new int[n + 1][n + 1];
int[][] s = new int[n + 1][n + 1];
for (int r = 2; r <= n; r++) {
for (int i = 1; i <= n - r + 1; i++) {
int j = i + r - 1;
m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];
/* System.out.println(String.format("i=%d, k=%d, j=%d, m[%d][%d] = %d ,m[%d+1][%d]=%d, " +
"p[%d-1] * p[%d] * p[%d]= %d , m[%d][%d] = %d "
, i, i, j, i, i,m[i][i], i, j, m[i + 1][j], i, i, j, p[i - 1] * p[i] * p[j], i, j, m[i][j]));*/
s[i][j] = i;
for (int k = i + 1; k < j; k++) {
int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
/* System.out.println(String.format("i=%d, k=%d, j=%d, m[%d][%d] = %d ,m[%d+1][%d]=%d, " +
"p[%d-1] * p[%d] * p[%d]= %d , m[%d][%d] = %d ", i, k, j, i, k, m[i][k], k, j, m[k + 1][j]
, i, k, j, p[i - 1] * p[k] * p[j], i, j, t));*/
if (t < m[i][j]) {
m[i][j] = t;
s[i][j] = k;
}
}
}
}
stringArrayList.add("(");
for (int i = 1; i <= 6; i++) {
stringArrayList.add("A" + i);
}
addPara(s, 1, n);
stringArrayList.add(")");
String result = stringArrayList.stream().collect(Collectors.joining("")).toString();
System.out.println(result);
System.out.println(m[1][n]);
return m[1][n];
}
ArrayList<String> stringArrayList = new ArrayList<>();
public void sbAppend(int low, int high) {
if (low == high) { //只有一个元素时,不加()
return;
}
stringArrayList.set(low, "(" + stringArrayList.get(low));
stringArrayList.set(high, stringArrayList.get(high) + ")");
}
void addPara(int[][] s, int low, int high) {
if (low == high) {
return;
}
int index = s[low][high];
sbAppend(low, index);
addPara(s, low, index);
sbAppend(index + 1, high);
addPara(s, index + 1, high);
}
public static void main(String[] args) {
int[] p = new int[]{30, 35, 15, 5, 10, 20, 25};
MatrixChain matrixChain = new MatrixChain();
int maxTimes = matrixChain.matrixChain(p);
}
}
输出结果
((A1(A2A3))((A4A5)A6))