1696. Jump Game VI

https://leetcode.com/problems/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

Constraints:

  • 1 <= nums.length, k <= 105

  • -104 <= nums[i] <= 104

给定数组nums,从第一个元素开始,每次能往前最远跳k步且收益为所跳到格子的值,问跳到最后一个位置时最大的收益是多少。虽然有一点不同,但思路基本和1425. Constrained Subsequence Sum一致:subseq + argmax => dp[i] == 此时最大序列和:argmax(dp[i - k], dp[i -k +1], ... dp[i - 1]) + nums[i]。找max(dp[i - k: i - 1])的过程相当于维持一个大小为k的在dp数组上的滑动窗口,且每次找窗口内最大元素=>单调栈。和1425区别在于必须从起点跳到终点,因此结果不再是max(dp)而是dp[-1],且dp[i - k: i - 1]必须要选一个,而不能因为是负数而不选。

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

Last updated