Leetcode 1563. Stone Game V
题目链接: Stone Game V
难度:Hard
题目大意:
详见题目。
思路:
参考高赞回答,动态规划,用memo来记录以前的结果,避免重复的计算。
代码
class Solution {
public int stoneGameV(int[] stoneValue) {
//思路:遍历所有结果
int n=stoneValue.length;
int[] prefixSum=new int[n+1];
for(int i=1;i<=n;i++){
prefixSum[i]=prefixSum[i-1]+stoneValue[i-1];
}
int[][] memo=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
memo[i][j]=-1;//-1为无效值,用来做标记
}
}
return helper(stoneValue,prefixSum,memo,0,n-1);
}
private int helper(int[] stoneValue,int[] prefixSum,int[][] memo,int l,int r){//返回输入数组为stoneValue[l,r]时的答案
if(l==r){
return 0;
}
if(r-l==1){
return Math.min(stoneValue[l],stoneValue[r]);
}
if(memo[l][r]!=-1){//如果已经是有效值了,直接返回
return memo[l][r];
}
for(int p=l+1;p<=r;p++){//左半边为[i,p),右半边为[p:]
int left=prefixSum[p]-prefixSum[l];
int right=prefixSum[r+1]-prefixSum[p];
if(left<right){
memo[l][r]=Math.max(memo[l][r],left+helper(stoneValue,prefixSum,memo,l,p-1));
}
if(left>right){
memo[l][r]=Math.max(memo[l][r],right+helper(stoneValue,prefixSum,memo,p,r));
}
if(left==right){
memo[l][r]=Math.max(memo[l][r],Math.max(left+helper(stoneValue,prefixSum,memo,l,p-1),right+helper(stoneValue,prefixSum,memo,p,r)));
}
}
return memo[l][r];
}
}