Maximum sum possible for a sub-sequence such that no two elements appear at a distance < K in the array
Last Updated :
06 Aug, 2021
Given an array arr[] of n integers and an integer k, the task is to find the maximum sum possible for a sub-sequence such that no two elements of the sub-sequence appear at a distance ? k in the original array.
Examples:
Input: arr[] = {5, 3, 4, 11, 2}, k=1
Output: 16
All possible sub-sequences are {5, 4, 2}, {5, 11}, {5, 2}, {3, 11}, {3, 2}, {4, 2} and {11}
Out of which 5 + 11 = 16 gives the maximum sum.
Input: arr[] = {6, 7, 1, 3, 8, 2, 4}, k = 2
Output: 15
Approach: While choosing an element at index i, we have two options, either we include the current element in the sub-sequence or we don’t. Let dp[i] represents the maximum sum so far on reaching element at index i. We can calculate the value of dp[i] as follows:
dp[i] = max(dp[i – (k + 1)] + arr[i], dp[i – 1])
dp[i – (k + 1)] + arr[i] is the case when element at index i is included. In that situation, maximum value will be arr[i] + maximum value till the last included element from the array.
dp[i – 1] is the case when current element is not included and the maximum value till now will be the maximum value till the previous element.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxSum( int * arr, int k, int n)
{
if (n == 0)
return 0;
if (n == 1)
return arr[0];
if (n == 2)
return max(arr[0], arr[1]);
int dp[n];
dp[0] = arr[0];
for ( int i = 1; i <= k; i++)
dp[i] = max(arr[i], dp[i - 1]);
for ( int i = k + 1; i < n; i++)
dp[i] = max(arr[i], dp[i - (k + 1)] + arr[i]);
int max = *(std::max_element(dp, dp + n));
return max;
}
int main()
{
int arr[] = { 6, 7, 1, 3, 8, 2, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 2;
cout << maxSum(arr, k, n);
return 0;
}
|
Java
class GFG
{
static int maxSum( int []arr, int k, int n)
{
if (n == 0 )
return 0 ;
if (n == 1 )
return arr[ 0 ];
if (n == 2 )
return Math.max(arr[ 0 ], arr[ 1 ]);
int [] dp = new int [n];
dp[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i <= k; i++)
dp[i] = Math.max(arr[i], dp[i - 1 ]);
for ( int i = k + 1 ; i < n; i++)
dp[i] = Math.max(arr[i], dp[i - (k + 1 )] + arr[i]);
return maximum(dp);
}
static int maximum( int [] arr)
{
int max = Integer.MIN_VALUE;
for ( int i = 0 ; i < arr.length; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
return max;
}
public static void main (String[] args)
{
int []arr = { 6 , 7 , 1 , 3 , 8 , 2 , 4 };
int n = arr.length;
int k = 2 ;
System.out.println(maxSum(arr, k, n));
}
}
|
Python3
def maxSum(arr, k, n) :
if (n = = 0 ) :
return 0 ;
if (n = = 1 ) :
return arr[ 0 ];
if (n = = 2 ) :
return max (arr[ 0 ], arr[ 1 ]);
dp = [ 0 ] * n ;
dp[ 0 ] = arr[ 0 ];
for i in range ( 1 , k + 1 ) :
dp[i] = max (arr[i], dp[i - 1 ]);
for i in range (k + 1 , n) :
dp[i] = max (arr[i],
dp[i - (k + 1 )] + arr[i]);
max_element = max (dp);
return max_element;
if __name__ = = "__main__" :
arr = [ 6 , 7 , 1 , 3 , 8 , 2 , 4 ];
n = len (arr);
k = 2 ;
print (maxSum(arr, k, n));
|
C#
using System;
using System.Linq;
class GFG
{
static int maxSum( int []arr, int k, int n)
{
if (n == 0)
return 0;
if (n == 1)
return arr[0];
if (n == 2)
return Math.Max(arr[0], arr[1]);
int [] dp = new int [n];
dp[0] = arr[0];
for ( int i = 1; i <= k; i++)
dp[i] = Math.Max(arr[i], dp[i - 1]);
for ( int i = k + 1; i < n; i++)
dp[i] = Math.Max(arr[i], dp[i - (k + 1)] + arr[i]);
int max = dp.Max();
return max;
}
static void Main()
{
int []arr = { 6, 7, 1, 3, 8, 2, 4 };
int n = arr.Length;
int k = 2;
Console.WriteLine(maxSum(arr, k, n));
}
}
|
Javascript
<script>
function maxSum(arr, k, n)
{
if (n == 0)
return 0;
if (n == 1)
return arr[0];
if (n == 2)
return Math.max(arr[0], arr[1]);
let dp = new Array(n);
dp[0] = arr[0];
for (let i = 1; i <= k; i++)
dp[i] = Math.max(arr[i], dp[i - 1]);
for (let i = k + 1; i < n; i++)
dp[i] = Math.max(arr[i], dp[i - (k + 1)] + arr[i]);
let max = Number.MIN_VALUE;
for (let i = 0; i < dp.length; i++)
{
max = Math.max(max, dp[i]);
}
return max;
}
let arr = [ 6, 7, 1, 3, 8, 2, 4 ];
let n = arr.length;
let k = 2;
document.write(maxSum(arr, k, n));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...