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);
    }
}
posted @ 2021-12-27 17:29  Tianyiya  阅读(64)  评论(0)    收藏  举报