Skip to content

Commit 350ba3a

Browse files
Merge pull request #1795 from CodingTestStudy2/이진희
[이진희] Day11
2 parents 95e4dc2 + 4fe9969 commit 350ba3a

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
3+
1. 아이디어 : dp 활용
4+
박스가 2개 이상일때 합치며 가장 큰 포인트를 구해야한다.
5+
이때 구간 [a,b]에서도 서로 다른 경우의 수가 존재한다.
6+
7+
dp[a][b][k]를 선언하여 - 구간 [a,b]에서 이미 박스[b]와 같은 색깔의 박스가 k개 존재한다고 가정.
8+
dfs를 통해 0, length-1으로 들어가고, 더 작은 구간을 재귀적으로 계산하는 top-down 방식으로 dp를 채운다.
9+
10+
2. 시간복잡도 : O(N^4) - 최대 N^3의 상태가 존재하고, 각 상태마다 같은 색 후보를 찾기 위해 최대 N개의 위치를 탐색
11+
12+
3. 자료구조/알고리즘 : DP, DFS
13+
14+
*/
15+
16+
class Solution {
17+
private int[][][] dp;
18+
public int removeBoxes(int[] boxes) {
19+
20+
// 전부 없엤을때 가장 높은 포인트
21+
dp = new int[boxes.length][boxes.length][boxes.length];
22+
int ans = dfs(0,boxes.length-1,0,boxes);
23+
24+
return ans;
25+
}
26+
27+
private int dfs(int a, int b, int k, int[] boxes) {
28+
29+
if(a>b) return 0;
30+
31+
if(dp[a][b][k] != 0) return dp[a][b][k];
32+
33+
dp[a][b][k] = dfs(a,b-1,0,boxes) + (k+1)*(k+1);
34+
35+
for(int i=a; i<b; i++) {
36+
if(boxes[i] == boxes[b]) {
37+
int score = dfs(a, i, k+1, boxes) + dfs(i+1, b-1, 0, boxes);
38+
dp[a][b][k] = Math.max(dp[a][b][k], score);
39+
}
40+
}
41+
42+
return dp[a][b][k];
43+
}
44+
}

0 commit comments

Comments
 (0)