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

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"; 
    }
}

 

posted @ 2020-04-06 22:49  守林鸟  阅读(325)  评论(0编辑  收藏  举报