Jump Game VI

Updated on 04 June, 2025
Jump Game VI header image

Problem Statement

You are provided with a zero-indexed integer array called nums and an integer k. Starting from the first position of the array (index 0), you are given the ability to "jump" up to k steps forward in each move, but you cannot jump past the end of the array. The final objective is to reach the last position of the array (index n - 1). The “score” is determined by adding up the values from nums at each index you land on during your jumps. The goal of this task is to determine the maximum score possible by jumping from the beginning to the end of the array under the given constraints.

Examples

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

Approach and Intuition

Given the nature of the problem, a dynamic programming (DP) approach is suitable to find the maximum score efficiently while complying with the movement constraints set by k.

  • Initial Thought:

    • At each step or index i in the array, you want to maintain the highest score achievable up to that point.
    • To implement this, you can use an array dp where dp[i] will store the maximum score you can achieve reaching the index i.
  • Key Insight:

    • When at any given index i, the next index you can jump to could be anywhere between i+1 and min(n-1, i+k) (where n is the length of nums). The score for any possible next index j is the current score dp[i] plus the value at nums[j].
    • Thus, dp[j] should be updated to be the maximum of its current value or the new possible higher score dp[i] + nums[j].
    • However, directly updating dp[j] for each potential j from every i leads to an O(n*k) solution, which may be inefficient for large inputs.
  • Optimization Using a Sliding Window:

    • You can maintain a window that keeps track of the maximum score within the last k indices as you iterate through nums. This window helps in updating the dp array in constant time for each index, thereby reducing the complexity considerably.
    • A deque (double-ended queue) can be employed where the maximum score at the front of the deque corresponds to the maximum score within the window of size k. As you move to the next index, update your dp using the front of the deque and adjust the deque to remove any indices that are out of this window and add the new index in its appropriate position to maintain the maximum score at the front.
  • Final Steps:

    1. Initialize the dp array where all elements are set to negative infinity, except dp[0] which should be set to nums[0] since that is where you start.
    2. Use a deque to help manage and quickly find the maximum score in the window of the last k steps.
    3. Iterate through the array and update dp using the deque and adjust the deque accordingly.
    4. The maximum score to reach the last index of the array will be found at dp[n-1].

By applying the above steps in a structured approach using dynamic programming combined with a deque for optimization, the problem of finding the maximum score when jumping through the array with given constraints can be efficiently solved.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int maxResult(vector<int>& elements, int limit) {
        int size = elements.size();
        int finalScore = elements[0];
        priority_queue<pair<int, int>> pq;
        pq.push({elements[0], 0});
        for (int i = 1; i < size; i++) {
            while (pq.top().second < i - limit) {
                pq.pop();
            }
            finalScore = elements[i] + pq.top().first;
            pq.push({finalScore, i});
        }
        return finalScore;
    }
};

The provided solution for the Jump Game VI problem uses a sliding window maximum approach with a priority queue. This efficient algorithm handles cases where each jump's optimal score must be calculated and is constrained by a jump limit. Implement the solution by following these steps:

  • Define a function maxResult that takes a vector of integers elements and an integer limit, which specifies the maximum number of indices one can move backward from the current index.
  • Store the size of the input vector in size and initialize finalScore with the first element of elements.
  • Use a priority queue pq to maintain the maximum scores achievable up to the current index, ensuring that the scores are stored along with their respective indices.
  • Iterate from the second element to the end of the elements vector. During each iteration:
    1. Remove elements from the priority queue if they fall outside the current sliding window of length defined by limit.
    2. Calculate the current index's score by adding the top value of the priority queue (maximum score within the valid range) to the current element.
    3. Add the current score and index as a pair to the priority queue.
  • The function returns the finalScore, which is the maximum score achievable at the last index of the elements vector.

This process ensures an optimal solution is determined using a dynamic programming approach, efficiently handled by the maximum priority queue to dynamically adjust the considered score range within the defined limit. Through the iterations with the priority queue, the best possible scores are updated and maintained, leading to the best solution when reaching the end of the list. This approach is notably beneficial for its reduced computational complexity, especially vital for large input sizes where a simpler, iterative approach may be impractical.

java
class Solution {
    public int calculateMax(int[] values, int jump) {
        int length = values.length;
        int finalScore = values[0];
        PriorityQueue<int[]> maxHeap = new PriorityQueue<>((x, y) -> y[0] - x[0]);
        maxHeap.offer(new int[] { values[0], 0 });
        for (int idx = 1; idx < length; idx++) {
            while (maxHeap.peek()[1] < idx - jump) {
                maxHeap.poll();
            }
            finalScore = values[idx] + maxHeap.peek()[0];
            maxHeap.offer(new int[] { finalScore, idx });
        }
        return finalScore;
    }
}

The Java program provided solves the problem where you are attempting to find the maximum score you can get in a game scenario where you can jump up to a certain number of steps in an array of values. The summary of how the Java code achieves this involves the use of a maximum priority queue to efficiently fetch the highest score reachable within the allowable jump range.

Here's a breakdown of the approach:

  • The calculateMax method accepts an array values and an integer jump, indicating the maximum jumps you can make from any position.
  • Initialize finalScore to the first element of values as the starting point.
  • Utilize a PriorityQueue in a way that the largest element is always at the top (maxHeap). This data structure holds elements in the format [current_score, index] where current_score represents the best score achievable up to that index.
  • Iterate through each index idx of values starting from 1, as the start position is already initialized.
  • In each iteration:
    1. Clean the heap by removing entries of max Heap where the index is out of the allowable jump range (idx - jump).
    2. Update finalScore to the sum of the current value values[idx] and the maximum score from the heap.
    3. Push the new score and the current index onto the heap.
  • After processing all indices, finalScore contains the maximum score obtainable starting from values[0] and making at most jump steps at each point.

This method efficiently computes the solution in reduced time by leveraging the properties of a priority queue to maintain access to the highest score at each step.

python
class Solution:
    def maxScore(self, values: List[int], limit: int) -> int:
        length = len(values)
        current_max = values[0]
        max_heap = []
        heapq.heappush(max_heap, (-values[0], 0))
        for index in range(1, length):
            while max_heap[0][1] < index-limit:
                heapq.heappop(max_heap)
            current_max = values[index] - max_heap[0][0]
            heapq.heappush(max_heap, (-current_max, index))
        return current_max

The Python solution for the problem described aims to find the maximum score a player can achieve from an array of integers where the player can jump between 1 to 'limit' indices forward at each step. The approach utilizes dynamic programming principles combined with a max-heap data structure to efficiently keep track of the maximum achievable scores within the allowable jump limit.

Understand the detailed breakdown of the Python function maxScore:

  • Initializes necessary variables:
    • length captures the length of the input list values.
    • current_max starts with the value at the first index.
    • max_heap is used to store tuples where each tuple contains the negative of the maximum score achievable so far, and its corresponding index.
  • The function iterates through every number in the array starting from the second number. For each number at index index:
    • Before calculating the new maximum score possible at this index, it removes stale entries from the heap (heapq.heappop(max_heap)). These are entries where the index is out of the current limit.
    • The current_max is calculated by adding the value at the current index with the maximum value fetched from the top of the heap (which is the most recent highest value within the jump limit).
    • Updates the heap by pushing the negation of the current_max along with the current index to maintain the maximum values within the allowable range.
  • After processing all indices, the value of current_max contains the maximum score achievable under the given rules.

This approach efficiently calculates the maximum possible score without requiring a traversal of all potential score paths, thanks to the max-heap structure which always keeps the highest score accessible.

Comments

No comments yet.