Maximum sum subsequence with at-least k distant elements
Last Updated :
02 Aug, 2022
Given an array and a number k, find a subsequence such that
- Sum of elements in subsequence is maximum
- Indices of elements of subsequence differ atleast by k
Examples
Input : arr[] = {4, 5, 8, 7, 5, 4, 3, 4, 6, 5}
k = 2
Output: 19
Explanation: The highest value is obtained
if you pick indices 1, 4, 7, 10 giving
4 + 7 + 3 + 5 = 19
Input: arr[] = {50, 70, 40, 50, 90, 70, 60,
40, 70, 50}
k = 2
Output: 230
Explanation: There are 10 elements and k = 2.
If you select 2, 5, and 9 you get a total
value of 230, which is the maximum possible.
A simple solution is to consider all subsequences one by one. In every subsequence, check for distance condition and return the maximum sum subsequence. An efficient solution is to use dynamic programming.
There are two cases:
- If we select element at index i such that i + k + 1 >= N, then we cannot select any other element as part of the subsequence. Hence we need to decide whether to select this element or one of the elements after it.
- If we select element at index i such that i + k + 1 < N, then the next element we can select is at i + k + 1 index. Thus we need to decide whether to select these two elements, or move on to the next adjacent element.
These two cases can be written as:
Let MS[i] denotes the maximum sum of subsequence
from i = N-2 to 0.
Base Case:
MS[N-1] = arr[N-1]
If i + 1 + k >= N
MS[i] = max(arr[i], MS[i+1]),
Else
MS[i] = max(arr[i] + MS[i+k+1], MS[i+1])
Evidently, the solution to the problem
is to find MS[0].
Below is the implementation:
C++
// CPP program to find maximum sum subsequence
// such that elements are at least k distance
// away.
#include <bits/stdc++.h>
using namespace std;
int maxSum(int arr[], int N, int k)
{
// MS[i] is going to store maximum sum
// subsequence in subarray from arr[i]
// to arr[n-1]
int MS[N];
// We fill MS from right to left.
MS[N - 1] = arr[N - 1];
for (int i = N - 2; i >= 0; i--) {
if (i + k + 1 >= N)
MS[i] = max(arr[i], MS[i + 1]);
else
MS[i] = max(arr[i] + MS[i + k + 1], MS[i + 1]);
}
return MS[0];
}
// Driver code
int main()
{
int N = 10, k = 2;
int arr[] = { 50, 70, 40, 50, 90, 70, 60, 40, 70, 50 };
cout << maxSum(arr, N, k);
return 0;
}
Java
// Java program to find maximum sum subsequence
// such that elements are at least k distance
// away.
import java.io.*;
class GFG {
static int maxSum(int arr[], int N, int k)
{
// MS[i] is going to store maximum sum
// subsequence in subarray from arr[i]
// to arr[n-1]
int MS[] = new int[N];
// We fill MS from right to left.
MS[N - 1] = arr[N - 1];
for (int i = N - 2; i >= 0; i--) {
if (i + k + 1 >= N)
MS[i] = Math.max(arr[i], MS[i + 1]);
else
MS[i] = Math.max(arr[i] + MS[i + k + 1],
MS[i + 1]);
}
return MS[0];
}
// Driver code
public static void main(String[] args)
{
int N = 10, k = 2;
int arr[] = { 50, 70, 40, 50, 90, 70, 60,
40, 70, 50 };
System.out.println(maxSum(arr, N, k));
}
}
// This code is contributed by Prerna Saini
Python3
# Python3 program to find maximum
# sum subsequence such that elements
# are at least k distance away.
def maxSum(arr, N, k):
# MS[i] is going to store maximum sum
# subsequence in subarray from arr[i]
# to arr[n-1]
MS = [0 for i in range(N)]
# We fill MS from right to left.
MS[N - 1] = arr[N - 1]
for i in range(N - 2, -1, -1):
if (i + k + 1 >= N):
MS[i] = max(arr[i], MS[i + 1])
else:
MS[i] = max(arr[i] + MS[i + k + 1],
MS[i + 1])
return MS[0]
# Driver code
N = 10; k = 2
arr = [ 50, 70, 40, 50, 90, 70, 60, 40, 70, 50 ]
print(maxSum(arr, N, k))
# This code is contributed by Anant Agarwal.
C#
// C# program to find maximum sum
// subsequence such that elements
// are at least k distance away.
using System;
class GFG {
static int maxSum(int []arr, int N, int k)
{
// MS[i] is going to store maximum sum
// subsequence in subarray from arr[i]
// to arr[n-1]
int []MS = new int[N];
// We fill MS from right to left.
MS[N - 1] = arr[N - 1];
for (int i = N - 2; i >= 0; i--) {
if (i + k + 1 >= N)
MS[i] = Math.Max(arr[i], MS[i + 1]);
else
MS[i] = Math.Max(arr[i] + MS[i + k + 1],
MS[i + 1]);
}
return MS[0];
}
// Driver code
public static void Main()
{
int N = 10, k = 2;
int []arr = { 50, 70, 40, 50, 90, 70, 60,
40, 70, 50 };
Console.WriteLine(maxSum(arr, N, k));
}
}
// This code is contributed by Anant Agarwal.
PHP
<?php
// PHP program to find
// maximum sum subsequence
// such that elements are
// at least k distance
// away.
function maxSum($arr, $N, $k)
{
// MS[i] is going to
// store maximum sum
// subsequence in
// subarray from arr[i]
// to arr[n-1]
// We fill MS from
// right to left.
$MS[$N - 1] = $arr[$N - 1];
for ($i = $N - 2; $i >= 0; $i--)
{
if ($i + $k + 1 >= $N)
$MS[$i] = max($arr[$i],
$MS[$i + 1]);
else
$MS[$i] = max($arr[$i] +
$MS[$i + $k + 1],
$MS[$i + 1]);
}
return $MS[0];
}
// Driver code
$N = 10; $k = 2;
$arr = array(50, 70, 40, 50, 90,
70, 60, 40, 70, 50);
echo(maxSum($arr, $N, $k));
// This code is contributed by Ajit.
?>
JavaScript
<script>
function maxSum(arr, N, k)
{
// MS[i] is going to store maximum sum subsequence
// in subarray from arr[i] to arr[n-1]
let MS = [];
MS.length = N;
MS[N-1] = arr[N-1];
for(let i = N - 2; i >= 0; i--){
if(i+k+1 >= N){
MS[i] = Math.max(arr[i], MS[i+1]);
}
else{
MS[i] = Math.max(arr[i] + MS[i+k+1], MS[i+1]);
}
}
return MS[0];
}
let N = 10, k = 2;
let arr = [ 50, 70, 40, 50, 90, 70, 60, 40, 70, 50];
document.write(maxSum(arr, N, k));
// This code is contributed by lokeshmvs21.
</script>
Time Complexity : O(n) Auxiliary Space : O(n)
Similar Reads
Maximum subsequence sum such that all elements are K distance apart Given an array arr[] of N integers and another integer K. The task is to find the maximum sum of a subsequence such that the difference of the indices of all consecutive elements in the subsequence in the original array is exactly K. For example, if arr[i] is the first element of the subsequence the
10 min read
Count of subsequences having maximum distinct elements Given an arr of size n. The problem is to count all the subsequences having maximum number of distinct elements. Examples: Input : arr[] = {4, 7, 6, 7} Output : 2 The indexes for the subsequences are: {0, 1, 2} - Subsequence is {4, 7, 6} and {0, 2, 3} - Subsequence is {4, 6, 7} Input : arr[] = {9, 6
5 min read
Maximum sum subsequence with values differing by at least 2 Given a positive integer array arr[] of size N, the task is to find the maximum sum of a subsequence with the constraint that no 2 numbers in the sequence should be adjacent to the value i.e. if arr[i] is taken into the answer, then neither occurrences of arr[i]-1 nor arr[i]+1 can be selected. Examp
10 min read
Longest alternating subsequence with maximum sum | Set 2 Given an array arr[] of size N, consisting of positive and negative integers, the task is to find the longest alternating subsequence(i.e. the sign of every element is opposite to that of its previous element) from the given array which has the maximum sum.Examples: Input: arr[] = {-2, 10, 3, -8, -4
7 min read
Maximum subsequence sum such that no K elements are consecutive Given an array arr[] of N positive integers, the task is to find the maximum sum of a subsequence consisting of no K consecutive array elements. Examples: Input: arr[] = {10, 5, 8, 16, 21}, K = 4Output: 55Explanation:Maximum sum is obtained by picking 10, 8, 16, 21. Input: arr[] = {4, 12, 22, 18, 34
9 min read