leetcode877.StoneGame

题目:一个数组,俩人从里面取数,要么从最左边取,要么从最右边取,直至把所有数取完,若第一个人取得所有数之和比第二个人取得数之和大,则为true

输入:一个整型数组

输出:true or false

别人思路:
  使用动态规划的思想:设dp[i][j]表示从piles[i]到piles[j]你可以比对手多得的最多的分数。这样我们的最终目标是dp[0][n-1]。
  现在我们需要确定转移方程和初始条件。在piles[i]~piles[j]中,你可以选择piles[i]或者piles[j]:
  如果你选择了piles[i],那么你的对手就会从piles[i+1]~piles[j]中得到最多的分数,分数差值为piles[i]-dp[i+1][j].(题目要求都发挥最佳水平,所以对于对手而言dp的含义一样。,他会从剩下的piles中选择最多的分数,所以两者做减法。)
  如果你选择了piles[j],分数差值为piles[j] - dp[i][j-1].
所以状态转移方程为:
dp[i][j] = max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1])

class solution{
    public boolean stoneGame(int[] piles) {
        int dp[][] = new int[piles.length][piles.length] ;
        for(int i=0;i<piles.length;i++){
            dp[i][i] = piles[i] ;
        }
        for(int j=1;j<piles.length;j++){
            for(int i=0;i<piles.length-j;i++){
                dp[i][i+j] = Math.max(piles[i] - dp[i+1][i+j], piles[i+j] - dp[i][i+j-1]) ;
            }
        }
        return dp[0][dp.length-1] > 0 ;
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值