Maximum score possible from an array with jumps of at most length K

Given an array arr[] and an integer K, the 0th index, the task is to collect the maximum score possible by performing the following operations:
- Start from the 0th index of the array.
- Reach the last index of the array by jumping at most K indices in each move.
- Add the value of every index reached after each jump.
- Initialize an array dp[] to store the previously computed results.
- Now, starting from the 0th index, perform the following operations for every ith index:
- If the current index is greater than or equal to the index of the last element, return the last element of the array.
- If the value for the current index is pre-calculated, then return the pre-calculated value.
- Otherwise, calculate maximum score that can be obtained by moving to all steps in the range i + 1 to i + K and store results for respective indices in dp[] array using the following recurrence relation:
dp[i] = max(dp[i + 1], dp[i + 2], dp[i + 3], ….., dp[i + K]) + A[i].
- Now, print dp[0] as the required answer.
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function to count the maximum// score of an indexint maxScore(int i, int A[], int K, int N, int dp[]){ // Base Case if (i >= N - 1) return A[N - 1]; // If the value for the current // index is pre-calculated if (dp[i] != -1) return dp[i]; int score = INT_MIN; // Calculate maximum score // for all the steps in the // range from i + 1 to i + k for (int j = 1; j <= K; j++) { // Score for index (i + j) score = max(score, maxScore(i + j, A, K, N, dp)); } // Update dp[i] and return // the maximum value return dp[i] = score + A[i];}// Function to get maximum score// possible from the array A[]int getScore(int A[], int N, int K){ // Array to store memoization int dp[N]; // Initialize dp[] with -1 for (int i = 0; i < N; i++) dp[i] = -1; cout << maxScore(0, A, K, N, dp);}// Driver Codeint main(){ int A[] = { 100, -30, -50, -15, -20, -30 }; int K = 3; int N = sizeof(A) / sizeof(A[0]); getScore(A, N, K); return 0;} |
Java
// JAVA program for the above approachimport java.io.*;import java.math.*;import java.util.*;public class GFG { // Function to count the maximum // score of an index static int maxScore(int i, int A[], int K, int N, int dp[]) { // Base Case if (i >= N - 1) return A[N - 1]; // If the value for the current // index is pre-calculated if (dp[i] != -1) return dp[i]; int score = Integer.MIN_VALUE; // Calculate maximum score // for all the steps in the // range from i + 1 to i + k for (int j = 1; j <= K; j++) { // Score for index (i + j) score = Math.max(score, maxScore(i + j, A, K, N, dp)); } // Update dp[i] and return // the maximum value return dp[i] = score + A[i]; } // Function to get maximum score // possible from the array A[] static void getScore(int A[], int N, int K) { // Array to store memoization int dp[] = new int[N]; // Initialize dp[] with -1 for (int i = 0; i < N; i++) dp[i] = -1; System.out.println(maxScore(0, A, K, N, dp)); } // Driver Code public static void main(String args[]) { int A[] = { 100, -30, -50, -15, -20, -30 }; int K = 3; int N = A.length; getScore(A, N, K); }}// This code is contributed by jyoti369 |
Python3
# Python program for the above approachimport sys# Function to count the maximum# score of an indexdef maxScore(i, A, K, N, dp): # Base Case if (i >= N - 1): return A[N - 1]; # If the value for the current # index is pre-calculated if (dp[i] != -1): return dp[i]; score = 1-sys.maxsize; # Calculate maximum score # for all the steps in the # range from i + 1 to i + k for j in range(1, K + 1): # Score for index (i + j) score = max(score, maxScore(i + j, A, K, N, dp)); # Update dp[i] and return # the maximum value dp[i] = score + A[i]; return dp[i];# Function to get maximum score# possible from the array Adef getScore(A, N, K): # Array to store memoization dp = [0]*N; # Initialize dp with -1 for i in range(N): dp[i] = -1; print(maxScore(0, A, K, N, dp));# Driver Codeif __name__ == '__main__': A = [100, -30, -50, -15, -20, -30]; K = 3; N = len(A); getScore(A, N, K); # This code contributed by shikhasingrajput |
Javascript
<script>// javascript program of the above approach // Function to count the maximum // score of an index function maxScore(i, A, K, N, dp) { // Base Case if (i >= N - 1) return A[N - 1]; // If the value for the current // index is pre-calculated if (dp[i] != -1) return dp[i]; let score = -1000; // Calculate maximum score // for all the steps in the // range from i + 1 to i + k for (let j = 1; j <= K; j++) { // Score for index (i + j) score = Math.max(score, maxScore(i + j, A, K, N, dp)); } // Update dp[i] and return // the maximum value return dp[i] = score + A[i]; } // Function to get maximum score // possible from the array A[] function getScore(A, N, K) { // Array to store memoization let dp = new Array(N).fill(-1); document.write(maxScore(0, A, K, N, dp)); } // Driver Code let A = [ 100, -30, -50, -15, -20, -30 ]; let K = 3; let N = A.length; getScore(A, N, K);</script> |
C#
// C# program for the above approachusing System;class GFG{ // Function to count the maximum // score of an index static int maxScore(int i, int []A, int K, int N, int []dp) { // Base Case if (i >= N - 1) return A[N - 1]; // If the value for the current // index is pre-calculated if (dp[i] != -1) return dp[i]; int score = int.MinValue; // Calculate maximum score // for all the steps in the // range from i + 1 to i + k for (int j = 1; j <= K; j++) { // Score for index (i + j) score = Math.Max(score, maxScore(i + j, A, K, N, dp)); } // Update dp[i] and return // the maximum value return dp[i] = score + A[i]; } // Function to get maximum score // possible from the array A[] static void getScore(int []A, int N, int K) { // Array to store memoization int []dp = new int[N]; // Initialize dp[] with -1 for (int i = 0; i < N; i++) dp[i] = -1; Console.WriteLine(maxScore(0, A, K, N, dp)); }// Driver Codestatic public void Main(){ int []A = { 100, -30, -50, -15, -20, -30 }; int K = 3; int N = A.Length; getScore(A, N, K);}}// This code is contributed by jana_sayantan. |
55
Time Complexity: O(N * K)
Auxiliary Space: O(N * K)
Another approach : DP tabulation ( Iterative approach )
The approach to solve this problem is same but DP tabulation(bottom-up) method is better then Dp + memorization(top-down) because memorization method needs extra stack space of recursion calls.
Implementations Steps :
- Initialize a DP array of size N, where DP[i] represents the maximum score that can be obtained starting from position i.
- Initialize DP[N-1] with the value of the last element of the array A.
- Traverse the DP array from the second last index to the first.
- For each index i, consider all possible steps that can be taken from that position, i.e., 1 to K steps forward.
- For each step, calculate the maximum score that can be obtained by adding the score at the current position i to the maximum score that can be obtained from the destination position j.
- Update DP[i] with the maximum score obtained among all the possible steps.
- Return DP[0], which represents the maximum score that can be obtained starting from the first position.
Implementation :
C++
// C++ program for above approach#include <bits/stdc++.h>using namespace std;int getScore(int A[], int N, int K) { // Initialize dp array with values for the last element int dp[N]; dp[N - 1] = A[N - 1]; // Traverse dp array from the second last index to the first for (int i = N - 2; i >= 0; i--) { // initial score int score = INT_MIN; for (int j = 1; j <= K && i + j < N; j++) { // Update the score with the maximum value // found among the possible steps score = max(score, dp[i + j]); } // Calculate the maximum score possible dp[i] = score + A[i]; } // return answer return dp[0];}// Driver codeint main() { int A[] = { 100, -30, -50, -15, -20, -30 }; int K = 3; int N = sizeof(A) / sizeof(A[0]); //function call cout << getScore(A, N, K); return 0;}// this code is contributed by bhardwajji |
Java
// Java program for above approachimport java.util.Arrays;public class Main { public static int getScore(int[] A, int N, int K) { // Initialize dp array with values for the last element int[] dp = new int[N]; dp[N - 1] = A[N - 1]; // Traverse dp array from the second last index to the first for (int i = N - 2; i >= 0; i--) { // initial score int score = Integer.MIN_VALUE; for (int j = 1; j <= K && i + j < N; j++) { // Update the score with the maximum value // found among the possible steps score = Math.max(score, dp[i + j]); } // Calculate the maximum score possible dp[i] = score + A[i]; } // return answer return dp[0]; } // Driver code public static void main(String[] args) { int[] A = { 100, -30, -50, -15, -20, -30 }; int K = 3; int N = A.length; // function call System.out.println(getScore(A, N, K)); }} |
Python3
class Main: @staticmethod def getScore(A, N, K): # Initialize dp array with values for the last element dp = [0] * N dp[N - 1] = A[N - 1] # Traverse dp array from the second last index to the first for i in range(N - 2, -1, -1): # initial score score = float('-inf') for j in range(1, K + 1): # Update the score with the maximum value # found among the possible steps if i + j < N: score = max(score, dp[i + j]) # Calculate the maximum score possible dp[i] = score + A[i] # return answer return dp[0]if __name__ == '__main__': A = [100, -30, -50, -15, -20, -30] K = 3 N = len(A) # function call print(Main.getScore(A, N, K)) |
C#
using System;public class Program { public static int GetScore(int[] A, int N, int K) { // Initialize dp array with values for the last element int[] dp = new int[N]; dp[N - 1] = A[N - 1]; // Traverse dp array from the second last index to the first for (int i = N - 2; i >= 0; i--) { // initial score int score = int.MinValue; for (int j = 1; j <= K && i + j < N; j++) { // Update the score with the maximum value // found among the possible steps score = Math.Max(score, dp[i + j]); } // Calculate the maximum score possible dp[i] = score + A[i]; } // return answer return dp[0]; } // Driver code public static void Main() { int[] A = { 100, -30, -50, -15, -20, -30 }; int K = 3; int N = A.Length; // function call Console.WriteLine(GetScore(A, N, K)); }} |
Javascript
// JavaScript program for above approachfunction getScore(A, N, K) {// Initialize dp array with values for the last elementlet dp = new Array(N);dp[N - 1] = A[N - 1];// Traverse dp array from the second last index to the firstfor (let i = N - 2; i >= 0; i--) { // initial score let score = -Infinity; for (let j = 1; j <= K && i + j < N; j++) { // Update the score with the maximum value // found among the possible steps score = Math.max(score, dp[i + j]); } // Calculate the maximum score possible dp[i] = score + A[i];}// return answerreturn dp[0];}// Driver codelet A = [100, -30, -50, -15, -20, -30];let K = 3;let N = A.length;// function callconsole.log(getScore(A, N, K)); |
55
Time Complexity: O(N * K), where N is the size of the array and K is the input variable
Auxiliary Space: O(N)
Efficient Approach: Follow the steps below to solve the problem
- Initialize a Max Heap to store the result of previous K indices.
- Now, traverse the array A[] to calculate the maximum score for all indices.
- For 0th index, the score will be the value at the 0th index.
- Now, for every ith index in the range [1, N – 1].
- Firstly, remove maximum scores from the Max Heap for indices less than i – K.
- Now calculate the maximum score for ith index.
Maximum score = A[i] + score at the top of the Max Heap. - Now insert the maximum score into the max heap with its index.
- Return the maximum score obtained.
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Structure to sort a priority queue on // the basis of first element of the pair struct mycomp { bool operator()(pair<int, int> p1, pair<int, int> p2) { return p1.first < p2.first; } }; // Function to calculate maximum // score possible from the array A[] int maxScore(int A[], int K, int N) { // Stores the score of previous k indices priority_queue<pair<int, int>, vector<pair<int, int> >, mycomp> maxheap; // Stores the maximum // score for current index int maxScore = 0; // Maximum score at first index maxheap.push({ A[0], 0 }); // Traverse the array to calculate // maximum score for all indices for (int i = 1; i < N; i++) { // Remove maximum scores for // indices less than i - K while (maxheap.top().second < (i - K)) { maxheap.pop(); } // Calculate maximum score for current index maxScore = A[i] + maxheap.top().first; // Push maximum score of // current index along // with index in maxheap maxheap.push({ maxScore, i }); } // Return the maximum score return maxScore; } // Driver Code int main() { int A[] = { -44, -17, -54, 79 }; int K = 2; int N = sizeof(A) / sizeof(A[0]); // Function call to calculate // maximum score from the array A[] cout << maxScore(A, K, N); return 0; } |
Java
// Java code for the above approach:import java.util.*;public class Main { static class IntPair { int first; int second; IntPair(int x, int y) { this.first = x; this.second = y; } } static class HeapComparator implements Comparator<IntPair> { public int compare(IntPair p1, IntPair p2) { if (p1.first < p2.first) return 1; else if (p1.first > p2.first) return -1; return 0; } } // Function to calculate maximum // score possible from the array A[] static int maxScore(int A[], int K, int N) { // Stores the score of previous k indices PriorityQueue<IntPair> maxheap = new PriorityQueue<IntPair>( new HeapComparator()); // Stores the maximum // score for current index int maxScore = 0; // Maximum score at first index maxheap.add(new IntPair(A[0], 0)); // Traverse the array to calculate // maximum score for all indices for (int i = 1; i < N; i++) { // Remove maximum scores for // indices less than i - K while (maxheap.peek().second < (i - K)) { maxheap.remove(); } // Calculate maximum score for current index maxScore = A[i] + maxheap.peek().first; // Push maximum score of // current index along // with index in maxheap maxheap.add(new IntPair(maxScore, i)); } // Return the maximum score return maxScore; } // Driver Code public static void main(String args[]) { int A[] = { -44, -17, -54, 79 }; int K = 2; int N = A.length; // Function call to calculate // maximum score from the array A[] System.out.println(maxScore(A, K, N)); }}// This code has been contributed by Sachin Sahara// (sachin801) |
Python3
# Python program for the above approach# Function to calculate maximum# score possible from the array A[]def maxScore(A, K, N): # Stores the score of previous k indices maxheap = [] # Stores the maximum # score for current index maxScore = 0 # Maximum score at first index maxheap.append([A[0], 0]) # Traverse the array to calculate # maximum score for all indices for i in range(1, N): # Remove maximum scores for # indices less than i - K while(maxheap[len(maxheap) - 1][1] < (i - K)): maxheap.pop() # Calculate maximum score for current index maxScore = A[i] + maxheap[len(maxheap) - 1][0] # Push maximum score of # current index along # with index in maxheap maxheap.append([maxScore, i]) maxheap.sort() # Return the maximum score return maxScore# Driver CodeA = [-44, -17, -54, 79]K = 2N = len(A)# Function call to calculate# maximum score from the array A[]print(maxScore(A, K, N))# This code is contributed by Pushpesh Raj. |
Javascript
<script>// Javascript program for the above approach // Function to calculate maximum // score possible from the array A[] function maxScore(A, K, N) { // Stores the score of previous k indices var maxheap = []; // Stores the maximum // score for current index var maxScore = 0; // Maximum score at first index maxheap.push([A[0], 0]); // Traverse the array to calculate // maximum score for all indices for (var i = 1; i < N; i++) { // Remove maximum scores for // indices less than i - K while (maxheap[maxheap.length-1][1] < (i - K)) { maxheap.pop(); } // Calculate maximum score for current index maxScore = A[i] + maxheap[maxheap.length-1][0]; // Push maximum score of // current index along // with index in maxheap maxheap.push([maxScore, i]); maxheap.sort(); } // Return the maximum score return maxScore; } // Driver Code var A = [-44, -17, -54, 79]; var K = 2; var N = A.length; // Function call to calculate // maximum score from the array A[] document.write(maxScore(A, K, N)); // This code is contributed by noob2000.</script> |
C#
// C# program for the above approach using System;using System.Collections.Generic;class GFG{ // Function to calculate maximum // score possible from the array A[] static int maxScore(int[] A, int K, int N) { // Stores the score of previous k indices List<Tuple<int, int>> maxheap = new List<Tuple<int, int>> (); // Stores the maximum // score for current index int maxScore = 0; // Maximum score at first index maxheap.Add(Tuple.Create(A[0], 0)); // Traverse the array to calculate // maximum score for all indices for (int i = 1; i < N; i++) { // Remove maximum scores for // indices less than i - K while (maxheap[0].Item2 < (i - K)) { maxheap.RemoveAt(0); } // Calculate maximum score for current index maxScore = A[i] + maxheap[0].Item1; // Add maximum score of // current index along // with index in maxheap maxheap.Add(Tuple.Create(maxScore, i )); maxheap.Sort(); maxheap.Reverse(); } // Return the maximum score return maxScore; } // Driver Code public static void Main(string[] args) { int[] A = { -44, -17, -54, 79 }; int K = 2; int N = A.Length; // Function call to calculate // maximum score from the array A[] Console.WriteLine(maxScore(A, K, N)); }}// This code is contributed by phasing17. |
18
Time Complexity: O(N * log K)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



