546. 移除盒子
给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。
你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k * k 个积分。
当你将所有盒子都去掉之后,求你能获得的最大积分和。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-boxes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
private int[][][] dp;
private int solve(int[] boxes, int left, int right, int pre) {
if (left > right) {
return 0;
}
if (dp[left][right][pre] == 0) {
int pos = left;
int num = pre;
while (pos <= right && boxes[pos] == boxes[left]) {
pos++;
num++;
}
int ans = num * num + solve(boxes, pos, right, 0);
for (int i = pos; i <= right; ++i) {
if (boxes[i] == boxes[left]) {
ans = Math.max(ans, solve(boxes, pos, i - 1, 0) + solve(boxes, i, right, num));
}
}
dp[left][right][pre] = ans;
}
return dp[left][right][pre];
}
public int removeBoxes(int[] boxes) {
this.dp = new int[boxes.length][boxes.length][boxes.length];
return solve(boxes, 0, boxes.length - 1, 0);
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号