Leetcode 486. 预测赢家

1、心路历程

这道题最开始想到的做法是回溯,因为看起来遍历就可以做,但是又想到同时需要维护两个人的数据就有点懵了。后来提示说用动态规划做是OK的。

这道题最难的地方在于,需要把输赢建模成"净胜分",这样就能把两个主体合并为一个主体去动态规划。在明白了这一点之后,5分钟就自己写出来了。

这道题的本质和hot100里那个 乘积最大子数组 需要区分正负数一样,这里也需要区分两个人来分别递推。

2、注意的点

1、注意当递推到第二个人手里时,需要求得是一个最小值而不是最大值。

3、解法 递归动态规划:

python 复制代码
class Solution:
    def predictTheWinner(self, nums: List[int]) -> bool:
        n = len(nums)
        @cache
        def dp(i, j, k): # i - j 区间的最大净胜值 k = 1代表先手者 否则是后手者
            if j - i == 0:
                if k == 1:
                    return nums[i]
                else:
                    return - nums[i]
            if k == 1:
                return max(nums[i] + dp(i+1, j, 0), nums[j] + dp(i, j-1, 0))
            else:
                return min(-nums[i] + dp(i+1, j, 1), - nums[j] + dp(i, j-1, 1))
        return dp(0, n-1, 1) >= 0
相关推荐
weixin_468466851 天前
遗传算法求解TSP旅行商问题python代码实战
python·算法·算法优化·遗传算法·旅行商问题·智能优化·np问题
·白小白1 天前
力扣(LeetCode) ——43.字符串相乘(C++)
c++·leetcode
FMRbpm1 天前
链表5--------删除
数据结构·c++·算法·链表·新手入门
程序员buddha1 天前
C语言操作符详解
java·c语言·算法
John_Rey1 天前
API 设计哲学:构建健壮、易用且符合惯用语的 Rust 库
网络·算法·rust
愿没error的x1 天前
动态规划、贪心算法与分治算法:深入解析与比较
算法·贪心算法·动态规划
NONE-C1 天前
动手学强化学习 第6章 Dyna-Q 算法
算法
惊讶的猫1 天前
面向无监督行人重识别的摄像头偏差消除学习
人工智能·算法·机器学习
深度学习机器1 天前
RAG Chunking 2.0:提升文档分块效果的一些经验
人工智能·算法·llm
努力学习的小全全1 天前
【CCF-CSP】05-01数列分段
数据结构·算法·ccf-csp