1class Solution {2public:3int dp[103][103][2];4int rec(int i, int m, int p, vector<int> &piles) {5if (i == piles.size()) return 0;6if (dp[i][m][p] != -1) return dp[i][m][p];7int cnt = 0, ans = INT_MIN, n = piles.size();8for (int j = i; j < min(n, i + 2 * m); j++) {9cnt += piles[j];10ans = max(ans, cnt - rec(j + 1, max(j - i + 1, m), 1 - p, piles));11}12return dp[i][m][p] = ans;13}14int stoneGameII(vector<int> &piles) {15int sum = 0;16memset(dp, -1, sizeof(dp));17for (auto i : piles) sum += i;18return (sum + rec(0, 1, 0, piles)) / 2;19}20};