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
| int[][][] memo; int[] piles; int n; public int stoneGameII(int[] piles) { n=piles.length; memo=new int[n+1][n+1][2]; this.piles=piles; for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { for (int k = 0; k < 2; k++) { memo[i][j][k]=-1; } } } return dp(0,1,0); }
int dp(int i, int m, int turn){ if(i>=n){ return 0; } if(memo[i][m][turn]!=-1){ return memo[i][m][turn]; } int sum=0; int res= turn==0 ? 0 : Integer.MAX_VALUE; for(int x=1; x<=Math.min(n-i,2*m); x++){ sum+=piles[i+x-1]; if(turn==0){ res=Math.max(res,sum+dp(i+x,Math.max(m,x),1)); }else{ res=Math.min(res,dp(i+x,Math.max(m,x),0)); } } return memo[i][m][turn]=res; }
|