|
|
@ -36,18 +36,17 @@ public class Code02_RemoveBoxes {
|
|
|
|
|
|
|
|
|
|
|
|
public static int process2(int[] boxes, int L, int R, int K, int[][][] dp) {
|
|
|
|
public static int process2(int[] boxes, int L, int R, int K, int[][][] dp) {
|
|
|
|
if (L > R) {
|
|
|
|
if (L > R) {
|
|
|
|
return K * K;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (dp[L][R][K] > 0) {
|
|
|
|
if (dp[L][R][K] > 0) {
|
|
|
|
return dp[L][R][K];
|
|
|
|
return dp[L][R][K];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int ans = 0;
|
|
|
|
|
|
|
|
int last = L;
|
|
|
|
int last = L;
|
|
|
|
while (last + 1 <= R && boxes[last + 1] == boxes[L]) {
|
|
|
|
while (last + 1 <= R && boxes[last + 1] == boxes[L]) {
|
|
|
|
last++;
|
|
|
|
last++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int pre = K + last - L;
|
|
|
|
int pre = K + last - L;
|
|
|
|
ans = (pre + 1) * (pre + 1) + process2(boxes, last + 1, R, 0, dp);
|
|
|
|
int ans = (pre + 1) * (pre + 1) + process2(boxes, last + 1, R, 0, dp);
|
|
|
|
for (int i = last + 2; i <= R; i++) {
|
|
|
|
for (int i = last + 2; i <= R; i++) {
|
|
|
|
if (boxes[i] == boxes[L] && boxes[i - 1] != boxes[L]) {
|
|
|
|
if (boxes[i] == boxes[L] && boxes[i - 1] != boxes[L]) {
|
|
|
|
ans = Math.max(ans, process2(boxes, last + 1, i - 1, 0, dp) + process2(boxes, i, R, pre + 1, dp));
|
|
|
|
ans = Math.max(ans, process2(boxes, last + 1, i - 1, 0, dp) + process2(boxes, i, R, pre + 1, dp));
|
|
|
|