Find maximum Subsequence Sum according to given conditions


Given an integer array nums and an integer K, The task is to find the maximum sum of a non-empty subsequence of the array such that for every two consecutive integers in the subsequence, nums[i] and nums[j], where i < j, the condition j – i <= K is satisfied.

A subsequence of an array is obtained by deleting some number of elements (can be zero) from the array, leaving the remaining elements in their original order.

Examples:

Input: nums = [10, 2, -10, 5, 20], K = 2
Output: 37
Explanation: 
The subsequence is [10, 2, 5, 20].

Input: nums = [-1, -2, -3], K = 1
Output: -1

Input: nums = [10, -2, -10, -5, 20], K = 2
Output: 23

Aprroach:

  • The optimal solution of this problem can be achieved by using the Sliding Window Maximum .
  • For every index, check what is the maximum value that can be obtained from a window of size K before it. If the maximum value is negative, use zero instead.
filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the maximum sum 
// subsequence under given constraint
#include <bits/stdc++.h>
using namespace std;
  
// Function return the maximum sum 
int ConstrainedSubsetSum(vector<int>& nums,
                         int k)
{
    deque<pair<int, int> > d;
      
    // Iterating the given array
    for (int i = 0; i < nums.size(); i++)
    {
        // Check if deque is empty
        nums[i] += d.size()
            ? max(d.back().first, 0) : 0;
          
        while (d.size() &&
               d.front().first < nums[i])
            d.pop_front();
          
        d.push_front({ nums[i], i });
          
        if (d.back().second == i - k)
            d.pop_back();
    }
  
    int ans = nums[0];
      
    for (auto x : nums)
        ans = max(ans, x);
  
    return ans;
}
  
// Driver code
int main()
{
    vector<int> nums = { 10, -2, -10, 
                        -5, 20 };
    int K = 2;
      
    // Function call
    cout << ConstrainedSubsetSum(nums, K) 
        << endl;
    return 0;
}

chevron_right


Output:

23

Time Complexity: O(N)
Space Complexity: O(K)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.