




Sponsored
Sponsored
This approach involves using dynamic programming with a sliding window to maintain the maximum sum at each position. For each position i in the array, calculate the maximum sum that can be achieved till that position, considering the constraint j - i <= k. Use a deque to track the indices which offer the maximum sum within the range of k.
Time Complexity: O(n), where n is the number of elements in the array nums. The space complexity is O(n) due to the storage of the dp array and deque.
1function constrainedSubsequenceSum(nums, k) {
2    const dp = Array(nums.length).fill(0);
3    const deque = [];
4    let maxSum = nums[0];
5    dp[0] = nums[0];
6    deque.push(0);
7
8    for (let i = 1; i < nums.length; i++) {
9        if (deque[0] < i - k) deque.shift();
10        dp[i] = nums[i] + (deque.length ? dp[deque[0]] : 0);
11        maxSum = Math.max(maxSum, dp[i]);
12        while (deque.length && dp[deque[deque.length - 1]] <= dp[i]) deque.pop();
13        deque.push(i);
14    }
15
16    return maxSum;
17}
18
19const nums = [10, 2, -10, 5, 20];
20const k = 2;
21console.log(constrainedSubsequenceSum(nums, k));In JavaScript, we manage the indices of potential maximum sum contributors using an array to function as a deque, updating sums efficiently within each window.
By using a priority queue (or heap), we manage the maximum possible sum within the constraint more efficiently. We employ dynamic programming to calculate the possible maximal sum at each index while maintaining a priority queue to keep track of the relevant maximum sums.
Time Complexity: O(n log k) primarily due to heap operations. Space Complexity: O(n) is utilized by the dp array and the heap.
1using System.Collections.Generic;
class Program {
    public static int ConstrainedSubsequenceSum(int[] nums, int k) {
        SortedDictionary<int, List<int>> map = new SortedDictionary<int, List<int>>(Comparer<int>.Create((x, y) => y.CompareTo(x)));
        int[] dp = new int[nums.Length];
        dp[0] = nums[0];
        if (!map.ContainsKey(nums[0])) map[nums[0]] = new List<int>();
        map[nums[0]].Add(0);
        int maxSum = nums[0];
        for (int i = 1; i < nums.Length; i++) {
            if (map.TryGetValue(map.Keys.GetEnumerator().Current, out List<int> indices) && indices[0] < i - k) {
                int v = indices[0];
                if (map[v].Count == 1) map.Remove(v);
                else map[v].RemoveAt(0);
            }
            int maxPrior = map.Keys.GetEnumerator().Current;
            dp[i] = nums[i] + maxPrior;
            if (!map.ContainsKey(dp[i])) map[dp[i]] = new List<int>();
            map[dp[i]].Add(i);
            maxSum = Math.Max(maxSum, dp[i]);
        }
        return maxSum;
    }
    static void Main(string[] args) {
        int[] nums = { 10, 2, -10, 5, 20 };
        int k = 2;
        Console.WriteLine(ConstrainedSubsequenceSum(nums, k));
    }
}This C# utilizes a dictionary to maintain the highest attainable sequence sums in their respective windows, enhancing optimization over dynamic windows and constraints.