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 index 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_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 Code int 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 approach import 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 approach import sys # Function to count the maximum # score of an index def 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 A def 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 Code if __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 approach using 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 Code static 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 code int 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 approach import 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 approach function getScore(A, N, K) { // Initialize dp array with values for the last element let dp = new Array(N); dp[N - 1] = A[N - 1]; // Traverse dp array from the second last index to the first for (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 answer return dp[0]; } // Driver code let A = [100, -30, -50, -15, -20, -30]; let K = 3; let N = A.length; // function call console.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 Code A = [ - 44 , - 17 , - 54 , 79 ] K = 2 N = 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 neveropen!