亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。

游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。

亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。

假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。

=========================================

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/stone-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

=========================================
动态规划,设dp[i][j]表示在第i堆石头到第j堆石头中,先手的人比后手的人多拿到的分。

也就是说,当石堆个数为偶数时,先手的人是亚历克斯,当石堆个数为奇数个时,先手的人是李。也就是说,当只有一堆石子的时候,dp[0][0]=piles[0],dp[1][1]=piles[1],…,dp[n][n]=piles[n],只有一堆石子的时候表示先手的李比亚历克斯多拿到的分数。

当只有两堆石子的时候,先手的是亚历克斯,那么石子堆的情况有dp[0][1],dp[1][2],…,dp[n-1][n]。亚历克斯和李都很聪明,那么先手的亚历克斯的动态规划状态转移方程表示为dp[i][j]=max(piles[i]−dp[i+1][j],piles[j]−dp[i][j−1])dp[i][j] = max(piles[i] - dp[i+1][j],piles[j] - dp[i][j-1])dp[i][j]=max(piles[i]−dp[i+1][j],piles[j]−dp[i][j−1])该公式表示,我先手拿到的石子得分要最大化,因为dp[i][j-1]和dp[i+1][j]都是已经知道的,所以可以得到当前情况下先手的最大得分。

同理,当有三堆石子的时候,先手的变为李,那么状态转移方程同样是dp[i][j]=max(piles[i]−dp[i+1][j],piles[j]−dp[i][j−1])dp[i][j] = max(piles[i] - dp[i+1][j],piles[j] - dp[i][j-1])dp[i][j]=max(piles[i]−dp[i+1][j],piles[j]−dp[i][j−1])这样一直到最后的dp[0][n]就可以判断到底是亚历克斯还是李赢得胜利。

那么可以知道,当石堆个数为n(偶数时),先手的是亚历克斯。如果dp[0][n]大于0,则亚历克斯赢,如果dp[0][n]小于0,则表示后手的李赢。

python代码如下:

class Solution:def stoneGame(self, piles: List[int]) -> bool:n = len(piles)dp = [[0]*n for _ in range(n)]for i in range(n):dp[i][i] = piles[i]  # 只有一堆石子的情况for size in range(1,n):  # 判断dp[i][j]中先手的人的得分for i in range(n):j = i + sizeif j >n-1:breakdp[i][j] = max(piles[i] - dp[i+1][j],piles[j] - dp[i][j-1])return dp[0][n-1] > 0

leetcode —— 877. 石子游戏相关推荐

  1. LeetCode 877. 石子游戏

    1.题目 877. 石子游戏 2.题解 首先,一开始我觉得这道题目并不严谨.因为我大略感觉到先手选择的人就能赢得这个游戏,因为你总是可以在当前的选择中选择对自己有利的拿取方式,而后手只能在剩下的机会中 ...

  2. leetcode 877. 石子游戏(dp)

    题目 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历克斯 ...

  3. 【Leetcode 877. 石子游戏】DP求解

    题面: 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历克 ...

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

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

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

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

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

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

  7. LeetCode 1690.石子游戏VII

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

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

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

  9. LeetCode 1140.石子游戏 II

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

最新文章

  1. 以下哪个不是python中的关键字-以下哪个选项不是Python语言的保留字
  2. php上位机grps通信,松下PLC与上位机通信实例
  3. 创建透明窗口及其应用--屏幕画笔
  4. 异想-天开 python---while、for、if-else 循环学习
  5. 浮点数在计算机中存储方式float,double)---转
  6. 【Spark】Spark ML 机器学习的一个案例
  7. 虚拟机linux搭建samba,搭建samba服务使在windows上使用虚拟机为linux
  8. python模拟登录获取Cookie
  9. 微信小程序调查报告(二)-账号注册篇
  10. (七)python3 切片
  11. 软件需求最佳实践笔记(二)
  12. 目标检测-爬虫-利用百度识图的方法来批量的爬取图片生产数据集
  13. 台式计算机刚做完系统就蓝屏,做完系统蓝屏怎么办|刚做完系统重启电脑蓝屏解决方法...
  14. 一般程序员正常会会几种语言?
  15. 计算机无法打印 重启又好了,打印机显示通讯错误,不能打印,但电脑重启后又好了!这是为什么?...
  16. 最完美安装amd显卡驱动方法
  17. VSTO 系列(06)-自定义任务窗格
  18. 算法:数学黑洞6174
  19. 联瑞网卡获得银河麒麟操作系统适配认证证书
  20. 单场淘汰制场次计算方法_单淘汰赛什么意思?

热门文章

  1. jquery学习。。
  2. Docker的今生前世,关于Docker的一些见解
  3. SpringBoot热加载实现与类加载浅谈
  4. Docker快速部署PostgreSQL服务
  5. 北方民族大学计算机全国排名,校友会:全国15所民族类大学排名,这三所大学进入十强...
  6. 计算机网络-网络应用
  7. java导数据到Excel
  8. 【vue-element-admin 】侧栏原始图标颜色一键指定
  9. 【Python】Python库之文本处理
  10. web全栈架构师所需技术栈_统一架构–一种构建全栈应用程序的简单方法