Skip to content

546. Remove Boxes

#183

Problem link

https://leetcode.com/problems/remove-boxes/

Problem Summary

계속해서 연속된 수를 제거할 수 있고 제거한 개수의 제곱의 점수를 얻을 수 있다. 최대로 얻는 점수를 구하는 문제.

Solution

하드 중에서도 하드한 문제.

다른 사람의 풀이를 보고 풀긴 하였다.

일단 결론부터 말하면 3차원 DP 문제.
연속된 개수가 중요하므로 3차원으로 해야한다.

dp[i][j][k] = i 부터 j 까지의 최대 점수, k는 i와 같은 지금까지의 연속된 개수.
예제를 보면 알겠지만 1,3,2,2,2,3 에서 3을 앞에서 없애버리면 최대 점수가 되지 못한다. 222를 제거 후 33을 제거해야 하는데 이런 처리를 위해 k가 필요하다.

문제 난이도에 비해 코드는 간단한 편.

Source Code

from functools import lru_cache
from typing import List


class Solution:
    def removeBoxes(self, boxes: List[int]) -> int:

        @lru_cache(None)
        def solve(left: int, right: int, k: int):
            if left > right:
                return 0

            # k 를 그냥 사용
            ret = (k + 1) * (k + 1) + solve(left + 1, right, 0)

            for i in range(left + 1, right + 1):
                # i 까지 점수 계산, 그 뒤에 나온거로 합쳐서 계산            
                if boxes[i] == boxes[left]:
                    ret = max(ret, solve(left + 1, i - 1, 0) + solve(i, right, k + 1))

            return ret

        return solve(0, len(boxes) - 1, 0)