1696. 跳跃游戏 VI

题目描述

每次可以最多跳k步,最终落点是n-1。得分定义为路径上的nums[i]之和,问最大得分?

f1-动态规划+单调队列

基本分析

  1. 怎么跳可以取到最大?考虑跳到j点的最大值是f[j], 必须从满足j-i<=k的点i转移过来,问题就是在满足要求的区间内,怎么取到最大的f[i]?单调队列
  2. 队头舍去什么?不满足下标约束的点
  3. 怎么转移?队头得分+nums[j]
  4. 队尾怎么去冗余?比j靠前且f[i]>=f[j]的点

代码

class Solution:
def maxResult(self, nums: List[int], k: int) -> int:
n = len(nums)
f = [-inf] * n
f[0] = nums[0]
q = deque([0])
for i in range(1, n):
if q and i - q[0] > k:
q.popleft()
f[i] = f[q[0]] + nums[i]
while q and f[q[-1]] <= f[i]:
q.pop()
q.append(i)
return f[n-1]

总结

  1. 典型的单调队列优化的dp题目
  2. 给起点赋初值,从下个点开始遍历
posted @   zhangk1988  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示