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
相关推荐
AI进化营-智能译站22 分钟前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai
CS创新实验室1 小时前
从盘边到芯端——硬盘接口七十年变迁史
算法·磁盘调度
xvhao20131 小时前
单源、多源最短路
数据结构·c++·算法·深度优先·动态规划·图论·图搜索算法
MATLAB代码顾问2 小时前
多种群协同进化算法(MPCE)求解大规模作业车间调度问题——附MATLAB代码
开发语言·算法·matlab
FQNmxDG4S2 小时前
JVM内存模型详解:堆、栈、方法区与垃圾回收
java·jvm·算法
We་ct2 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·leetcode·typescript·动态规划
AI科技星2 小时前
精细结构常数α作为SI 7大基本量纲统一耦合常数的量子几何涌现理论
算法·机器学习·数学建模·数据挖掘·量子计算
txzrxz3 小时前
动态规划——背包问题
算法·动态规划
Yingye Zhu(HPXXZYY)3 小时前
洛谷 P15553 [CCPC 2025 哈尔滨站] 液压机
算法
谭欣辰3 小时前
LCS(最长公共子序列)详解
开发语言·c++·算法