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