⭐算法OJ⭐跳跃游戏【动态规划 + 单调队列】(C++实现)Jump Game 系列 VI

embedded/2025/3/6 14:04:25/

算法OJ⭐跳跃游戏【贪心算法】(C++实现)Jump Game 系列 I,II
算法OJ⭐跳跃游戏【BFS+滑动窗口】(C++实现)Jump Game 系列 III,IIV

1696. Jump Game VI

You are given a 0-indexed integer array nums and an integer k.

You are initially standing at index 0. In one move, you can jump at most k steps forward without going outside the boundaries of the array. That is, you can jump from index i to any index in the range [i + 1, min(n - 1, i + k)] inclusive.

You want to reach the last index of the array (index n - 1). Your score is the sum of all nums[j] for each index j you visited in the array.

Return the maximum score you can get.

Example 1:

Input: nums = [1,-1,-2,4,-7,3], k = 2
Output: 7
Explanation: You can choose your jumps forming the subsequence [1,-1,4,3] (underlined above). The sum is 7.

Example 2:

Input: nums = [10,-5,-2,4,0,3], k = 3
Output: 17
Explanation: You can choose your jumps forming the subsequence [10,4,3] (underlined above). The sum is 17.

Example 3:

Input: nums = [1,-5,-20,4,-1,3,-6,-3], k = 2
Output: 0

问题理解

给定一个 0 索引 的整数数组 nums 和一个整数 k。你最初站在索引 0 处。在每一次移动中,你可以向前跳跃最多 k 步,但不能跳出数组的边界。也就是说,你可以从索引 i 跳到范围 [i + 1, min(n - 1, i + k)] 内的任意索引。

你的目标是到达数组的最后一个索引(索引 n - 1)。你的 得分 是你访问过的所有索引 j 对应的 nums[j] 的总和。

要求返回 你能获得的最大得分

解决思路

这是一个典型的动态规划问题。我们需要找到从索引 0 到索引 n - 1 的最大得分路径。

  • 状态定义:

    • dp[i] 表示从索引 0 跳到索引 i 的最大得分。
  • 状态转移:

    • 对于每个索引 i,我们需要检查从 [ i − k , i − 1 ] [i - k, i - 1] [ik,i1] 范围内的所有可能的前一个位置 j,并选择使得 dp[j] + nums[i] 最大的值。
  • 状态转移方程为:
    d p [ i ] = m a x ( d p [ j ] + n u m s [ i ] ) 其中 j ∈ [ i − k , i − 1 ] dp[i]=max(dp[j]+nums[i])其中j∈[i−k,i−1] dp[i]=max(dp[j]+nums[i])其中j[ik,i1]

  • 初始条件:dp[0] = nums[0],因为起点是索引 0。

  • 优化:

    • 直接使用动态规划会导致时间复杂度为 O ( n × k ) O(n×k) O(n×k),对于较大的 n n n k k k 可能无法通过。
    • 可以使用单调队列(Monotonic Queue)优化,将时间复杂度降低到 O ( n ) O(n) O(n)
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;int maxResult(vector<int>& nums, int k) {int n = nums.size();vector<int> dp(n); // dp[i] 表示跳到索引 i 的最大得分dp[0] = nums[0];   // 初始条件deque<int> dq;     // 单调队列,存储索引dq.push_back(0);   // 初始队列for (int i = 1; i < n; i++) {// 移除不在窗口范围内的索引while (!dq.empty() && dq.front() < i - k) {dq.pop_front();}// 更新 dp[i]dp[i] = dp[dq.front()] + nums[i];// 维护单调队列while (!dq.empty() && dp[i] >= dp[dq.back()]) {dq.pop_back();}dq.push_back(i);}return dp[n - 1]; // 返回最后一个索引的最大得分
}

代码说明

  • 动态规划数组 dp
    • dp[i] 表示从索引 0 跳到索引 i 的最大得分。
    • 初始条件:dp[0] = nums[0]
  • 单调队列 dq
    • 用于维护当前窗口 [ i − k , i − 1 ] [i - k, i - 1] [ik,i1] 内的最大值对应的索引。
    • 队列中的索引对应的 dp 值是递减的。
  • 遍历数组:
    • 对于每个索引 i,移除队列中不在窗口范围内的索引。
    • 更新 dp[i]dp[dq.front()] + nums[i]
    • 维护单调队列,确保队列中的索引对应的 dp 值是递减的。
  • 返回结果:
    • 最终返回 dp[n - 1],即最后一个索引的最大得分。

复杂度分析

  • 时间复杂度:每个索引最多入队和出队一次,因此时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度:需要额外的 dp 数组和单调队列,空间复杂度为 O ( n ) O(n) O(n)

总结

  • 使用动态规划结合单调队列优化,可以高效地解决这个问题。
  • 时间复杂度为 O ( n ) O(n) O(n),适用于较大的输入规模。

http://www.ppmy.cn/embedded/170488.html

相关文章

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和pe…

后路式编程

今天遇到一个问题&#xff0c;反馈的时候&#xff0c;已经提审过了&#xff0c;不能重新出包了。只能依赖Lua热更解决。非常巧的是&#xff0c;C#那边的变量全是Public的&#xff0c;这算是救了一命。想想确实可笑&#xff0c;本来是封装的问题&#xff0c;没有封装的太好。结果…

网络安全管理平台建设思路

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为进一步明确计算机网络的管理部门和职责&#xff0c;保障计算机和网络的安全运行&#xff0c;特制定本管理规定.下面是学习啦小编跟大家分享的是有关计算机网络管…

如何保证域名网络安全性

如今&#xff0c;网络安全 问题日益受到众多网民的重视&#xff0c;在互联网上稍微疏忽就可能导致信息的泄露&#xff0c;再加上黑客这一以破坏他人良好体验感为乐的人存在&#xff0c;我们在互联网环境下一定要做好安全 保护措施。就以域名为例&#xff0c;域名注册后&#xf…

MyBatis框架之映射文件加载方式

在MyBatis框架中&#xff0c;映射文件&#xff08;XML&#xff09;的加载方式直接影响SQL与Java接口的绑定效率。以下是两种常用方式及其原理的详细说明&#xff1a; 一、通过resource属性加载XML映射文件 核心思想 直接通过XML配置文件逐一声明映射文件的相对路径&#xff0…

大数据与网络安全讲座

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大数据的价值为大家公认。业界通常以4个“V”来概括大数据的基本特征——Volume(数据体量巨大)、Variety(数据类型繁多)、Value(价值密度低)、Velocity(处理速度快…

神经网络入门:分类与回归(3)

在代码清单4-8和代码清单4-9中&#xff0c;我们将使用Matplotlib在同一张图上绘制训练损失和验证损失&#xff08;见图4-4&#xff09;&#xff0c;以及训练精度和验证精度&#xff08;见图4-5&#xff09;。由于模型的随机初始值不同&#xff0c;得到的结果可能会略有不同。 …

2025最新Transformer模型及深度学习前沿技术应用

第一章、注意力&#xff08;Attention&#xff09;机制 1、注意力机制的背景和动机&#xff08;为什么需要注意力机制&#xff1f;注意力机制的起源和发展里程碑&#xff09;。 2、注意力机制的基本原理&#xff08;什么是注意力机制&#xff1f;注意力机制的数学表达与基本公…