zoukankan      html  css  js  c++  java
  • 力扣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"; 
        }
    }
  • 相关阅读:
    自控力和专注力是执行力的保证
    今宵又除夕
    买了小米盒子三代
    电容相位滞后?电感超前
    lcr电桥浅谈
    ad 线束和网络
    浅谈 R_S触发器
    NTSC PAL 介绍
    verilog 之流水灯
    io 口方向调整 stm32
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12650308.html
Copyright © 2011-2022 走看看