Leetcode Java Stone Game II
업데이트:
문제
코드
class Solution {
public int stoneGameII(int[] piles) {
int length = piles.length;
for (int i = length - 2; i >= 0; i--) {
piles[i] += piles[i + 1];
}
return this.dfs(piles, new int[length][length], 1, 0);
}
private int dfs(int[] piles, int[][] dp, int m, int p) {
if (p + 2 * m >= piles.length) {
return piles[p];
} else if (dp[p][m] > 0) {
return dp[p][m];
} else {
int result = 0;
for (int i = 1; i <= 2 * m; i++) {
result = Math.max(result, piles[p] - this.dfs(piles, dp, Math.max(i, m), p + i));
}
dp[p][m] = result;
return result;
}
}
}
결과
설명
- 지난 번 Stone Game과 비슷하게, 아래 규칙대로 돌을 빼앗는 게임을 수행하여 얻을 수 있는 엘리스의 돌의 최대 갯수를 구하는 문제이다.
- 일렬로 정렬된 여러 개의 말뚝의 각 위치에 piles[i]개의 돌이 있다.
- m은 1로 엘리스와 밥 순서대로 서로 번갈아 시작한다.
- 1 <= X <= 2M를 만족하는 말뚝에 존재하는 X개의 돌을 가져가고 M에 M과 X 중 큰 값을 넣어준다.
-
length는 piles의 길이를 저장한 변수로, $length - 2$부터 0 이상까지 i를 감소시키며 piles의 i번째 위치에 $i + 1$번째 값을 더해준다.
-
4번에서 정의한 dfs(int[] piles, int[][] dp, int m, int p) 메서드를 dp에 $length \times length$ 크기의 정수 배열과 m과 p에 1과 0을 이용하여 수행한 결과를 주어진 문제의 결과로 반환한다.
- DFS 방식으로 돌의 수를 탐색할 dfs(int[] piles, int[][] dp, int m, int p) 메서드를 수행한다.
- $p + 2 \times m$의 결과가 piles의 길이보다 크거나 같은 경우, piles의 p의 위치에 해당하는 값을 반환한다.
- 위의 경우가 아니면서 dp[p][m]의 값이 0보다 큰 경우, 이미 수행된 결과이므로 해당 값을 반환한다.
- 위의 모든 경우가 아니라면 아래를 수행한다.
- result는 돌의 수를 저장하기 위한 변수로 0으로 초기화한다.
- 1부터 $2 \times m$ 이하까지 i를 증가시키며 result에 result와 piles[p]에 m에 i와 m 중 큰 값과 p에 $p + i$를 이용하여 재귀 호출한 결과를 넣어준다.
- dp[p][m]의 위치에 result를 넣고, result를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기