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

posted @ 2019-09-23 22:13  ljy3268  阅读(240)  评论(0编辑  收藏  举报