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

爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,M = 1。

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

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

假设爱丽丝和鲍勃都发挥出最佳水平,返回爱丽丝可以得到的最大数量的石头。

示例 1:

输入: piles = [2,7,9,4,4]
输出: 10
解释: 如果一开始Alice取了一堆,Bob取了两堆,然后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] <= 104

思路

dp[M][i]表示剩余石子堆为piles[i : len]时,M = M的情况下,先取的人能获得的最多石子数

  • i + 2M >= length, dp[M][i] = sum(piles[i : length]),剩下的堆数能够直接全部取走
  • i + 2M < length, dp[M][i] = max(dp[M][i],sum(piles[i : length]) - dp[max(M, X)][i + X]), 其中 1 <= X <= 2M,剩下的堆数不能全部取走,那么最优情况就是让下一个人取的更少。对于此时所有的x取值,下一个人从X开始取起,M变为max(M, X),所以下一个人能取dp[max(M, X)][i + X],此事最多能取sum[i : len - 1] - dp[max(M, X)][i + X]
#动态规划
class Solution(object):def stoneGameII(self, piles):length = len(piles)mysum = 0dp = [[0 for i in range(length)] for j in range(length+1)]for i in range(length-1,-1,-1):mysum += piles[i]for M in range(1,length+1):if i+2*M>=length:dp[M][i]=mysumelse:for X in range(1,2*M+1):dp[M][i] = max(dp[M][i],mysum-dp[max(M,X)][i+X])return dp[0][1]

参考文章:https://leetcode.cn/problems/stone-game-ii/solution/java-dong-tai-gui-hua-qing-xi-yi-dong-17xing-by-lg/

【LeetCode】1140-石子游戏II相关推荐

  1. LeetCode 1140. 石子游戏 II(DP)*

    文章目录 1. 题目 2. 解题 1. 题目 亚历克斯和李继续他们的石子游戏.许多堆石子 排成一行,每堆都有正整数颗石子 piles[i].游戏以谁手中的石子最多来决出胜负. 亚历克斯和李轮流进行,亚 ...

  2. LeetCode 1140.石子游戏 II

    题目描述 爱丽丝和鲍勃继续他们的石子游戏.许多堆石子 排成一行,每堆都有正整数颗石子 piles[i].游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = 1. 在每 ...

  3. LeetCode 1690. 石子游戏 VII(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获 ...

  4. LeetCode 1686. 石子游戏 VI(贪心)

    文章目录 1. 题目 2. 解题 283 / 1660,前17% 681 / 6572,前10.4% 1. 题目 Alice 和 Bob 轮流玩一个游戏,Alice 先手. 一堆石子里总共有 n 个石 ...

  5. LeetCode 1406. 石子游戏 III(DP)

    1. 题目 Alice 和 Bob 用几堆石子在做游戏.几堆石子排成一行,每堆石子都对应一个得分,由数组 stoneValue 给出. Alice 和 Bob 轮流取石子,Alice 总是先开始.在每 ...

  6. Leetcode 45. 跳跃游戏 II

    Leetcode 45. 跳跃游戏 II 题目 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组 ...

  7. leetcode 45. 跳跃游戏 II 46. 全排列

    leetcode 45. 跳跃游戏 II 46. 全排列 45. 跳跃游戏 II 难度中等1273收藏分享切换为英文接收动态反馈 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中 ...

  8. leetcode 45.跳跃游戏 II

    一.题意 给出一个非负整数数组 nums ,数组中的每个元素代表在该位置可以跳跃的最大长度.使用最少的跳跃次数到达数组的最后一个位置.假设总是可以到达数组的最后一个位置. 二.解法 贪心算法. 解法一 ...

  9. 1056-取石子游戏II

    取石子游戏II 描述 一堆石子有n个,两人轮流取.每次取最少取1个,最多取m个.取完者胜.先取者负输出"Second win".先取者胜输出"First win" ...

  10. LeetCode 1690.石子游戏VII

    LeetCode 1690.石子游戏VII 问题描述: 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的 ...

最新文章

  1. 如何实现对ELK各组件的监控?试试Metricbeat
  2. framebuffer 保存 bmp图片格式
  3. python连接oracle数据库的方法_Python3.6连接Oracle数据库的方法详解
  4. FXRibbon 1.2版发布
  5. PG13用pg_rman进行备份恢复
  6. Android6.0 dump h264/h265编码裸流(二)
  7. 关于无序分类变量量化的处理思考
  8. 19款国产手机无一幸免:15分钟破解人脸识别,打印眼镜让刷脸形同虚设
  9. 一个非计算机专业的 软考初级 程序员考试之路
  10. 关于ms17010渗透
  11. 产品经理如何更优商业思维
  12. Cocos2d-xV3.17.2获取csb文件按钮组件并绑定事件
  13. centos 7 下 硬盘GPT格式转换
  14. 离别的感受(转小百合)
  15. 第二章 第六课 Scratch作品:摇摇晃晃的虫子(随机数和碰到边缘就反弹)
  16. Java(回文数--比较简单的写法)
  17. ubuntu系统修改分辨率为2560*1440(2k,16:9)
  18. Angular中nz-select实现两个选择框互相关联
  19. Zcash的“十月围城”
  20. 小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)

热门文章

  1. LOJ2434. 「ZJOI2018」历史
  2. ABC command 逻辑综合流程(后续更新)
  3. nn.Conv2d()中dilation参数的作用
  4. 最新校园同学跑腿小程序完整源码+有安装教程
  5. maven整合SSM搭建项目
  6. dva框架二级路由刷新出现空白页
  7. HALCON 简单介绍
  8. 程序三年,遇到的趣事盘点。
  9. ManageEngine ADManager Plus 监控
  10. 一看就懂---Excel多人(共享)编辑功能设置技巧