https://leetcode.com/problems/stone-game-ii/description/?envType=daily-question&envId=2024-08-20
Alice and Bob continue their games with piles of stones. There are a number of piles arranged in a row, and each pile has a positive integer number of stones piles[i]. The objective of the game is to end with the most stones.
Alice and Bob take turns, with Alice starting first. Initially, M = 1.
On each player's turn, that player can take all the stones in the first X remaining piles, where 1 <= X <= 2M. Then, we set M = max(M, X).
The game continues until all the stones have been taken.
Assuming Alice and Bob play optimally, return the maximum number of stones Alice can get.
Example 1:
Input: piles = [2,7,9,4,4]
Output: 10
Explanation: If Alice takes one pile at the beginning, Bob takes two piles, then Alice takes 2 piles again. Alice can get 2 + 4 + 4 = 10 piles in total. If Alice takes two piles at the beginning, then Bob can take all three piles left. In this case, Alice get 2 + 7 = 9 piles in total. So we return 10 since it's larger.
Example 2:
Input: piles = [1,2,3,4,5,100]
Output: 104
Constraints:
- 1 <= piles.length <= 100
- 1 <= piles[i] <= 104
게임 설명을 봐도 당췌 뭔 소린지 모르겠다.
Dynamic Programming을 이용하라는데, 막막하다.
빠른 GG
1. C++
#C++ using DP
class Solution {
public:
int stoneGameII(vector<int>& piles) {
int n = piles.size();
vector<vector<int>> dp(n, vector<int>(n + 1, 0));
vector<int> suffixSum(n, 0);
suffixSum[n - 1] = piles[n - 1];
for (int i = n - 2; i >= 0; i--) {
suffixSum[i] = suffixSum[i + 1] + piles[i];
}
for (int i = n - 1; i >= 0; i--) {
for (int m = 1; m <= n; m++) {
if (i + 2 * m >= n) {
dp[i][m] = suffixSum[i];
} else {
for (int x = 1; x <= 2 * m; x++) {
dp[i][m] = max(dp[i][m], suffixSum[i] - dp[i + x][max(m, x)]);
}
}
}
}
return dp[0][1];
}
};
2. Python
#Python
class Solution:
def stoneGameII(self, piles: List[int]) -> int:
n = len(piles)
dp = [[0] * (n + 1) for _ in range(n)]
suffix_sum = [0] * n
suffix_sum[-1] = piles[-1]
for i in range(n - 2, -1, -1):
suffix_sum[i] = suffix_sum[i + 1] + piles[i]
for i in range(n - 1, -1, -1):
for m in range(1, n + 1):
if i + 2 * m >= n:
dp[i][m] = suffix_sum[i]
else:
for x in range(1, 2 * m + 1):
dp[i][m] = max(dp[i][m], suffix_sum[i] - dp[i + x][max(m, x)])
return dp[0][1]
DP는 쉬운 거 부터 차근차근 와야겠다..
'Coding_Practice' 카테고리의 다른 글
Best Time to Buy and Sell Stock[Array,Dynamic Programming] (0) | 2024.08.20 |
---|---|
Climbing Stairs[Math,Dynamic Programming,Memoization] (0) | 2024.08.20 |
Swap Nodes in Pairs[M,Linked List,Recursion] (0) | 2024.08.16 |
Maximum Distance in Arrays[M,Array,Greedy] (0) | 2024.08.16 |
Remove Duplicates from Sorted List[E,Linked List] (0) | 2024.08.14 |