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.


Input: nums = [10, 2, -10, 5, 20], K = 2
Output: 37
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


  • 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.




// 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.push_front({ nums[i], i });
        if (d.back().second == i - k)
    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;




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 or mail your article to 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.