leetcode 1140. 石子游戏 II 中等

Alice 和 Bob 继续他们的石子游戏。许多堆石子 排成一行 ,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。

Alice 和 Bob 轮流进行,Alice 先开始。最初,M = 1。

在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。

游戏一直持续到所有石子都被拿走。

假设 Alice 和 Bob 都发挥出最佳水平,返回 Alice 可以得到的最大数量的石头。

示例 1:

复制代码
输入:piles = [2,7,9,4,4]
输出:10
解释:如果一开始 Alice 取了一堆,Bob 取了两堆,然后 Alice 再取两堆。Alice 可以得到 2 + 4 + 4 = 10 堆。
如果 Alice 一开始拿走了两堆,那么 Bob 可以拿走剩下的三堆。在这种情况下,Alice 得到 2 + 7 = 9 堆。返回 10,因为它更大。

示例 2:

复制代码
输入:piles = [1,2,3,4,5,100]
输出:104

提示:

  • 1 <= piles.length <= 100
  • 1 <= piles[i] <= 10^4

分析:

要求出爱丽丝可以得到的最大数量的石头,可以先求出爱丽丝最多比鲍勃多拿的石头数量,再经过计算得到爱丽丝最多可以得到的石头数量。而在两方都采取最优策略的情况下,求其中一方的得分,这种情况可以用记忆化搜索来解题。

令数组 piles 的长度为 n。令 dfs(i,m) 表示前 i 堆石头已经被取走,当前的 M=m 的情况下,接下去取石头的玩家可以比另一方多取的石头数。边界情况为 i=n 时,当前玩家没有石头可以取,状态值为 0。其他情况下,需要遍历当前玩家取 x=1∼2m 堆石头,并减去对方玩家多取的石头数,挑选出最大值来作为最优策略,从而进行状态转移,即

刚开局时,爱丽丝执先手,她比鲍勃多拿的石头数即为 dfs(0,1)。记石头总数为 sum,她最多拿的石头数即为 (dfs(0,1)+sum)/2。

cpp 复制代码
int min(int a,int b)
{
    return a<b?a:b;
}
int max(int a,int b)
{
    return a>b?a:b;
}
int stoneGameII(int* piles, int pilesSize) {
    int n=pilesSize,dp[n+1][n+1];
    for(int i=0;i<=n;++i)
        for(int j=0;j<=n;++j)
            dp[i][j]=INT_MIN,dp[n][j]=0;

    for(int i=n-1;i>=0;--i)
    {
        for(int m=1;m<=n;++m)
        {
            int sum=0;
            for(int x=1;x<=2*m;++x)
            {
                if(i+x>n)break;
                sum+=piles[i+x-1];
                dp[i][m]=max(dp[i][m],sum-dp[i+x][min(n,max(m,x))]);
            }
            
        }
    }
    int sum=0;
    for (int i=0;i<n;i++)
        sum+=piles[i];
    return (dp[0][1]+sum)/2;
}
相关推荐
代码什么用31 分钟前
LeetCode-42. 接雨水
算法·leetcode
yi0112 小时前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
Navigator_Z4 小时前
LeetCode //C - 1269. Number of Ways to Stay in the Same Place After Some Steps
c语言·算法·leetcode
垆边人似月.6 小时前
华为算法题:最长连续递增子序列的变
数据结构·算法·leetcode
longlongzihan6 小时前
LeetCode 56合并区间:排序与贪心
c++·算法·leetcode
kukubuzai7 小时前
二分查找系列一
数据结构·算法·leetcode
Cccp.12320 小时前
【leetcode】(七)前缀树和贪心算法
数据结构·leetcode·贪心算法
优质酸酸乳1 天前
力扣100题之21合并两个有序链表
算法·leetcode·链表
旖旎夜光1 天前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控