• leetcode 1140. Stone Game II


    题意:

    亚历克斯和李继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。
    亚历克斯和李轮流进行,亚历克斯先开始。最初,M = 1。
    在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。
    游戏一直持续到所有石子都被拿走。
    假设亚历克斯和李都发挥出最佳水平,返回亚历克斯可以得到的最大数量的石头。

    思路:

    因为两个人都要发挥出最佳水平,所以策略相同,目的是让后于自己拿的尽可能少,可以用dp来做。

    记忆化搜索,dp[i][j]表示从第i个开始取时M为j的最大值,对于每一个状态,枚举用后缀和减去下一个状态,找到当前状态的最大值,dp[i][j]=max(dp[i][j],sum[i]-dp[i+x][max(j,x)]);

    代码:

     class Solution {
    public:
        int dp[110][110],sum[110];
        int stoneGameII(vector<int>& piles) {
            if(piles.size()==0)return 0;
            int n=piles.size();
            for(int i=n-1;i>=0;i--)sum[i]=sum[i+1]+piles[i];
            for(int i=0;i<n;i++){
                for(int j=1;j<=n;j++){
                    if(i+2*j>=n)dp[i][j]=sum[i];
                }
            }
            for(int i=n-1;i>=0;i--){
                for(int j=n;j>=1;j--){
                    for(int x=1;x<=2*j&&i+x<n;x++){
                        dp[i][j]=max(dp[i][j],sum[i]-dp[i+x][max(j,x)]);
                    }
                }
            }
            return dp[0][1];
        }
    };

  • 相关阅读:
    后端框架:SpringBoot+Mybatis+Dubbox(zookeeper+dubbo-admin)
    java代码执行mysql存储过程
    SpringBoot整合Junit
    摘要算法之MD5
    java如何控制下载的文件类型是txt还是doc?如何将文件名返回给前端?Content-disposition
    Android Atuido 连接模拟器
    verilog CRC 校验
    Altium Designer(AD软件)如何导出gerber文件
    SpringBoot集成mybatisplus
    C++ | 通过智能指针实现资源管理
  • 原文地址:https://www.cnblogs.com/ljy08163268/p/11575207.html
Copyright © 2020-2023  润新知