我觉得这种题目贼难写。。。。
首先还是一样,dp[i][M]定义为从【i,end-1】区间内,可以取到X属于[1, 2M]个点,使得当前人超过另一个人最多。
当取X个点时,结果为A[i]+A[i+1]+…A[i+x-1]-dp[i+x][max(M,x)].也就是当前取到的是当前人超过的个数;dp[i+x][max(M,x)]就是另一个人超过当前人最多,就得动了这个解。
也就是需要明确,什么时候结束,结束时候应该是什么。
class Solution {
public:
int stoneGameII(vector<int>& piles) {
int n = piles.size();
vector<int> temp(n, 0);
vector<vector<int>> dp(n, temp);
for(int i=n-1;i>=0;i--){
for(int M=n-1;M>=1;M--){
int sum = 0;
dp[i][M] = -1e9;
for(int x=1;x<=2*M;x++){ // 从i开始取x个
if (i+x-1<n){
sum += piles[i+x-1];
}
if (i+x<n&&max(M,x)<n){
dp[i][M] = max(dp[i][M], sum-dp[i+x][max(M,x)]);
}
else{
dp[i][M] = max(dp[i][M], sum);
}
}
}
}
int sum = 0;
for(int i=0;i<n;i++){
sum+=piles[i];
}
return (dp[0][1]+sum)/2;
}
};