# 1140. Stone Game II ###### tags: `Leetcode` `Medium` `Backtracking` `Min-Max Strategy` Link: https://leetcode.com/problems/stone-game-ii/ ## 思路 ```memo[idx][m]```表示当```M=m```时从第```idx```个piles开始拿最多能拿多少石头 显然答案就是```memo[0][1]``` 那么如何计算```memo[i][m]```呢? 当```M=m```并且我们从第```idx```个piles开始拿的时候我们可以拿```1~2*m```个piles 假设我们拿了```i```个piles对手一定从```idx+i```开始拿 所以```memo[idx+i][min(m,i)]```就会是他拿的数量 所以截止游戏时能得到的最大收益就是```sufSum[idx] - solve(idx+i, max(i,m))``` 对于所有的```i``` 我们只需要取可以让```sufSum[idx] - solve(idx+i, max(i,m))```最大的那个即可 ## Code ```java= class Solution { public int stoneGameII(int[] piles) { int n = piles.length; int[][] memo = new int[101][101]; int[] postSum = new int[n]; postSum[n-1] = piles[n-1]; for(int i=n-2; i>=0; i--){ postSum[i] = postSum[i+1]+piles[i]; } return solve(0, 1, memo, postSum); } private int solve(int idx, int m, int[][] memo, int[] postSum){ if(idx==postSum.length) return 0; if(memo[idx][m]!=0) return memo[idx][m]; for(int i=1; i<=2*m && idx+i<=postSum.length; i++){ memo[idx][m] = Math.max(memo[idx][m], postSum[idx]-solve(idx+i, Math.max(m, i), memo, postSum)); } return memo[idx][m]; } } ```