题目
题目来源:leetcode 486:预测赢家
给定一个表示分数的非负整数数组。 玩家1
从数组任意一端拿取一个分数,随后玩家2
继续从剩余数组任意一端拿取分数,然后玩家1
拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。
给定一个表示分数的数组,预测玩家1
是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。
示例:
输入: [1, 5, 233, 7]
输出: True
解释: 玩家 1 一开始选择 1 。然后玩家 2 必须从 5 和 7 中进行选择。无论玩家 2 选择了哪个,玩家 1 都可以选择 233 。
最终,玩家 1(234 分)比玩家 2(12 分)获得更多的分数,所以返回 True,表示玩家 1 可以成为赢家。
解题思路
本题使用动态规划,dp[i][j]
表示在数组nums[i..j]
中,先手玩家和后手玩家所获得的分数之差(每个玩家的玩法都会使他的分数最大化)。本题的先手是玩家1
,后手是玩家2
.
当i == j
时,dp[i][j] = nums[i]
或dp[i][j] = nums[j]
.
当i < j
时,如下图所示,每个玩家每次从数组的两端取一个数,变量turn == 1
表示玩家1
为先手,turn == -1
表示玩家2
为先手,分两种情况:
(1)玩家1
取nums[i]
,此时turn == 1