码迷,mamicode.com
首页 > 其他好文 > 详细

力扣1406-石子游戏III-(dp)

时间:2020-04-06 23:44:10      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:情况   leetcode   ret   game   ==   etc   也有   自己   tar   

https://leetcode-cn.com/problems/stone-game-iii/

题意:有n个数,有两个人,轮流取数,每次可以取前1、2、3个数,取到最后,谁的和大谁赢。

思路:类似上一篇,把数的大小看作收益,自己收益为x,别人收益为y,纯收益x-y。

不同取法都会对后面造成影响,但不管怎么取,都是从前往后,

如果只剩1个数,那就不得不取,收益一定,为a[n],哪怕数是负的。

如果只剩2个数,可以取2个,收益为a[n-1]+a[n];也可以取1个,收益为a[n-1],则剩下的1个给别人拿,别人也有个收益,相减就是纯收益。

如果剩下3个数,同理可以取1、2、3个,但是下一个人剩下2、1、0个数的收益是一样的。

设dp[i]表示剩下的[i,n]这些数能够获取的最大收益,当然是从dp[n]开始逆推到dp[1],只剩一个的时候收益固定。

每一次取法都有三种情况,判断一下就好了。

class Solution {
    public String stoneGameIII(int[] a) {
        int[] dp=new int[50005];
        int n=a.length-1;
        for(int i=n;i>=0;i--){
            dp[i]=a[i]-dp[i+1];//1堆
            if(i+1<=n)
                dp[i]=Math.max(dp[i],a[i]+a[i+1]-dp[i+2]);//2堆
            if(i+2<=n)
                dp[i]=Math.max(dp[i],a[i]+a[i+1]+a[i+2]-dp[i+3]);//3堆
        }
        if(dp[0]>0)
            return "Alice";
        else if(dp[0]==0)
            return "Tie";
        else 
            return "Bob"; 
    }
}

 

力扣1406-石子游戏III-(dp)

标签:情况   leetcode   ret   game   ==   etc   也有   自己   tar   

原文地址:https://www.cnblogs.com/shoulinniao/p/12650308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!