假设有两个玩家在玩游戏。在一条线上放置了多个糖果的情况下,第1人将获得一个称为nums的数字列表,该数字表示每个糖果的点值。轮到每个人时,他们可以从线的前面选择1,2个或3个糖果,然后从列表中将其删除,然后将其总分加到分数中。删除所有糖果后,这场比赛将结束,得分更高的人将成为赢家。我们必须检查第1人是否可以赢得这场比赛。
因此,如果输入类似于nums = [1、1、2、3、50],那么输出将为True,因为人1可以吃1糖果,而其他玩家则必须吃1、2或3个糖果。在任何情况下,人1都可以取值为50的糖果。
为了解决这个问题,我们将遵循以下步骤-
n:= nums的大小
table:=具有三个0的数组。
对于范围n − 1至0的i,减1,
sum_val:= sum_val +数字[j]
利润:=利润的最大值和(sum_val − table [j − i])
利润:= -inf
sum_val:= 0
对于范围i到最小i + 3和n的j,执行
设置表:=具有三个值的列表[profit,table [0],table [1]]
当table [0]> 0时返回true,否则返回false
让我们看下面的实现以更好地理解-
import math class Solution: def solve(self, nums): n = len(nums) table = [0, 0, 0] for i in range(n − 1, −1, −1): profit = −math.inf sum_val = 0 for j in range(i, min(i + 3, n)): sum_val += nums[j] profit = max(profit, sum_val − table[j − i]) table[:] = [profit, table[0], table[1]] return table[0] > 0 ob = Solution() nums = [1, 1, 2, 3, 50] print(ob.solve(nums))
[1, 1, 2, 3, 50]输出结果
True