# 0877. Stone Game ###### tags: `Leetcode` `Medium` `Min-Max Strategy` `Backtracking` Link: https://leetcode.com/problems/stone-game/ ## 思路 ### 思路一 先拿的人可以确保自己拿的数量总和是奇数 因为一定会赢 ### 思路二 ```dp[s][e]```代表player在剩的piles index是从```s```到```e```的时候拿走的最多的石头数 如果现在剩下的piles index是从```s```到```e``` 如果```s==e``` 直接拿走这一堆 否则看拿走```s```获得的石头多 还是拿走```e```获得的石头多 拿走```s```获得的石头数等于从```s```到```e```的总石头数-对手能拿走的石头数 ## Code ### 思路一 ```java= class Solution { public boolean stoneGame(int[] piles) { return true; } } ``` ### 思路二 ```java= class Solution { public boolean stoneGame(int[] piles) { int n = piles.length; int[][] dp = new int[n][n]; int[] prefixSum = new int[n]; prefixSum[0] = piles[0]; for(int i=1; i<n; i++) prefixSum[i] = prefixSum[i-1]+piles[i]; int total = prefixSum[n-1]; int myBest = dfs(0, n-1, piles, dp, prefixSum); return myBest>total-myBest; } private int dfs(int s, int e, int[] piles, int[][] dp, int[] prefixSum){ if(s==e) return dp[s][e] = piles[s]; if(dp[s][e]!=0) return dp[s][e]; int sum = prefixSum[e]-(s==0?0:prefixSum[s-1]); dp[s][e] = Math.max(sum-dfs(s+1, e, piles, dp, prefixSum), sum-dfs(s, e-1, piles, dp, prefixSum)); return dp[s][e]; } } ```