Skip to content

Commit b834c2d

Browse files
committed
day11
1 parent a1344d7 commit b834c2d

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class Solution:
2+
def removeBoxes(self, boxes: List[int]) -> int:
3+
n = len(boxes)
4+
5+
# 동일한 구간이라도 왼쪽에 안 지우고 남긴 같은 색 박스 개수에 따라 정답 달라짐
6+
# 선택지 2개로 나눠서 생각해야 함
7+
8+
# 정답 기록해놓는 배열
9+
memo = [[[0] * n for _ in range(n)] for _ in range(n)]
10+
11+
def dp(i, j, k):
12+
# i: 현재 처리 중인 구간의 시작 인덱스
13+
# j: 현재 처리 중인 구간의 끝 인덱스
14+
# k: boxes[i] 왼쪽에 붙어 있는 boxes[i]와 같은 색상의 박스 개수
15+
16+
# 박스 없으면 점수 0점
17+
if i > j:
18+
return 0
19+
20+
# 예전에 계산한 적 있으면 바로 반환
21+
if memo[i][j][k] > 0:
22+
return memo[i][j][k]
23+
24+
# 하나씩 인덱스 늘리면서 연속된 같은 색상 압축
25+
orig_i, orig_k = i, k
26+
while i < j and boxes[i] == boxes[i + 1]:
27+
i += 1
28+
k += 1
29+
30+
# 선택지 1: 현재 박스 바로 터트리기 (왼쪽 k개 + 자기자신 1개)
31+
# 점수는 (k + 1)^2가 된다. 남은 구간은 dp(i + 1, j, 0) 계산
32+
res = (k + 1) ** 2 + dp(i + 1, j, 0)
33+
34+
# 선택지 2: 중간 박스 지우고 뒤쪽의 같은 색과 합치기
35+
for m in range(i + 1, j + 1):
36+
if boxes[m] == boxes[i]:
37+
# i+1 ~ m-1 사이의 다른 색 박스들을 먼저 삭제
38+
# -> dp(i + 1, m - 1, 0)
39+
# 그 결과 boxes[i]와 boxes[m]이 합쳐짐
40+
# -> boxes[m] 기준 왼쪽에 (k + 1)개 박스가 붙게 됨
41+
# -> dp(m, j, k + 1)
42+
res = max(res, dp(i + 1, m - 1, 0) + dp(m, j, k + 1))
43+
44+
# 계산 결과 기록
45+
memo[orig_i][j][orig_k] = res
46+
return res
47+
48+
return dp(0, n - 1, 0)

0 commit comments

Comments
 (0)