leetcode 1690 石子游戏

石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。

有 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)); 
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值