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
相关推荐
北_鱼1 小时前
支持向量机(SVM):算法讲解与原理推导
算法·机器学习·支持向量机
MZWeiei3 小时前
PTA:运用顺序表实现多项式相加
算法
GISer_Jing3 小时前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
cookies_s_s3 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭3 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
水蓝烟雨4 小时前
[HOT 100] 2187. 完成旅途的最少时间
算法·hot 100
01_4 小时前
力扣hot100——LRU缓存(面试高频考题)
leetcode·缓存·面试·lru
菜鸟一枚在这5 小时前
深度解析建造者模式:复杂对象构建的优雅之道
java·开发语言·算法
gyeolhada5 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~5 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先