leetcode —— 877. 石子游戏
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 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. 石子游戏相关推荐
- LeetCode 877. 石子游戏
1.题目 877. 石子游戏 2.题解 首先,一开始我觉得这道题目并不严谨.因为我大略感觉到先手选择的人就能赢得这个游戏,因为你总是可以在当前的选择中选择对自己有利的拿取方式,而后手只能在剩下的机会中 ...
- leetcode 877. 石子游戏(dp)
题目 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历克斯 ...
- 【Leetcode 877. 石子游戏】DP求解
题面: 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历克 ...
- LeetCode 1690. 石子游戏 VII(博弈DP)
文章目录 1. 题目 2. 解题 1. 题目 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获 ...
- LeetCode 1686. 石子游戏 VI(贪心)
文章目录 1. 题目 2. 解题 283 / 1660,前17% 681 / 6572,前10.4% 1. 题目 Alice 和 Bob 轮流玩一个游戏,Alice 先手. 一堆石子里总共有 n 个石 ...
- LeetCode 1406. 石子游戏 III(DP)
1. 题目 Alice 和 Bob 用几堆石子在做游戏.几堆石子排成一行,每堆石子都对应一个得分,由数组 stoneValue 给出. Alice 和 Bob 轮流取石子,Alice 总是先开始.在每 ...
- LeetCode 1690.石子游戏VII
LeetCode 1690.石子游戏VII 问题描述: 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的 ...
- LeetCode 1140. 石子游戏 II(DP)*
文章目录 1. 题目 2. 解题 1. 题目 亚历克斯和李继续他们的石子游戏.许多堆石子 排成一行,每堆都有正整数颗石子 piles[i].游戏以谁手中的石子最多来决出胜负. 亚历克斯和李轮流进行,亚 ...
- LeetCode 1140.石子游戏 II
题目描述 爱丽丝和鲍勃继续他们的石子游戏.许多堆石子 排成一行,每堆都有正整数颗石子 piles[i].游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = 1. 在每 ...
最新文章
- 以下哪个不是python中的关键字-以下哪个选项不是Python语言的保留字
- php上位机grps通信,松下PLC与上位机通信实例
- 创建透明窗口及其应用--屏幕画笔
- 异想-天开 python---while、for、if-else 循环学习
- 浮点数在计算机中存储方式float,double)---转
- 【Spark】Spark ML 机器学习的一个案例
- 虚拟机linux搭建samba,搭建samba服务使在windows上使用虚拟机为linux
- python模拟登录获取Cookie
- 微信小程序调查报告(二)-账号注册篇
- (七)python3 切片
- 软件需求最佳实践笔记(二)
- 目标检测-爬虫-利用百度识图的方法来批量的爬取图片生产数据集
- 台式计算机刚做完系统就蓝屏,做完系统蓝屏怎么办|刚做完系统重启电脑蓝屏解决方法...
- 一般程序员正常会会几种语言?
- 计算机无法打印 重启又好了,打印机显示通讯错误,不能打印,但电脑重启后又好了!这是为什么?...
- 最完美安装amd显卡驱动方法
- VSTO 系列(06)-自定义任务窗格
- 算法:数学黑洞6174
- 联瑞网卡获得银河麒麟操作系统适配认证证书
- 单场淘汰制场次计算方法_单淘汰赛什么意思?