-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBracketsMCM.java
More file actions
54 lines (43 loc) · 1.38 KB
/
BracketsMCM.java
File metadata and controls
54 lines (43 loc) · 1.38 KB
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
53
54
package dp.mcm;
public class BracketsMCM {
static String str = "";
static char name = 'A';
static String matrixChainOrder(int[] p, int n) {
str = "";
name = 'A';
int[][] dp = new int[n][n];
int[][] bracket = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) dp[i][j] = -1;
}
solve(p, 1, n - 1, dp, bracket);
printOptimalParenthesis(1, n - 1, bracket);
return str;
}
public static void printOptimalParenthesis(int i, int j, int[][] memoization) {
if (i == j) {
str = str + name;
name++;
} else {
int k = memoization[i][j];
str = str + "(";
printOptimalParenthesis(i, k, memoization);
printOptimalParenthesis(k + 1, j, memoization);
str = str + ")";
}
}
static int solve(int[] p, int i, int j, int[][] dp, int[][] bracket) {
if (i >= j) return 0;
if (dp[i][j] != -1) return dp[i][j];
int min = Integer.MAX_VALUE;
for (int k = i; k < j; k++) {
int temp = solve(p, i, k, dp, bracket) + solve(p, k + 1, j, dp, bracket) + p[i - 1] * p[k] * p[j];
if (min > temp) {
min = temp;
dp[i][j] = min;
bracket[i][j] = k;
}
}
return min;
}
}