-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1140. Stone Game II.cpp
59 lines (44 loc) · 2.19 KB
/
1140. Stone Game II.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 1140. Stone Game II
// Solved
// Medium
// Topics
// Companies
// Hint
// 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
class Solution {
public:
int stoneGameII(vector<int>& piles) {
vector<vector<int>> memo(piles.size(), vector<int>(piles.size()));
vector<int> suffixSum = piles;
for (int i = suffixSum.size() - 2; i >= 0; --i)
suffixSum[i] += suffixSum[i + 1];
return maxStones(suffixSum, 1, 0, memo);
}
int maxStones(vector<int>& suffixSum, int maxTillNow, int currIndex,
vector<vector<int>>& memo) {
if (currIndex + 2 * maxTillNow >= suffixSum.size())
return suffixSum[currIndex];
if (memo[currIndex][maxTillNow] > 0) return memo[currIndex][maxTillNow];
int res = INT_MAX;
for (int i = 1; i <= 2 * maxTillNow; ++i) {
res = min(res, maxStones(suffixSum, max(i, maxTillNow),
currIndex + i, memo));
}
memo[currIndex][maxTillNow] = suffixSum[currIndex] - res;
return memo[currIndex][maxTillNow];
}
};