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

Posted shoulinniao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣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"; 
    }
}

 

以上是关于力扣1406-石子游戏III-(dp)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之深入解析“石子游戏III”的求解思路与算法示例

❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️

❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️

leetcode-5379-石子游戏③

线段树+dp

[海军国际项目办公室]石子游戏