石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。
有 n 块石子排成一排。每个玩家的回合中,可以从行中移除最左边的石头或最右边的石头,并获得与该行中剩余石头值之和相等的得分。当没有石头可移除时,得分较高者获胜。
鲍勃发现他总是输掉游戏(可怜的鲍勃,他总是输),所以他决定尽力减小得分的差值 。爱丽丝的目标是最大限度地扩大得分的差值 。
给你一个整数数组stones,其中stones[i]表示从左边开始的第 i 个石头的值,如果爱丽丝和鲍勃都发挥出最佳水平,请返回他们得分的差值 。
class Solution {
public int stoneGameVII(int[] stones) {
int n=stones.length,sum=0;
int[][] dp=new int[n][n];
for(int[] dpRow:dp)
Arrays.fill(dpRow,-1);
for(int stone:stones)
sum+=stone;
return solve(0,n-1,stones,sum,dp);
}
public int solve(int left,int right,int[] stones,int sum,int[][] dp){
if(right-left==1) return Math.max(stones[left],stones[right]);
if(dp[left][right]!=-1) return dp[left][right];
return dp[left][right]=Math.max(sum-stones[left]-solve(left+1,right,stones,sum-stones[left],dp),sum-stones[right]-solve(left,right-1,stones,sum-stones[right],dp));
}
}