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.
1#include <vector>
#include <queue>
using namespace std;
int constrainedSubsequenceSum(vector<int>& nums, int k) {
priority_queue<pair<int, int>> pq;
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
pq.push({nums[0], 0});
int maxSum = nums[0];
for (int i = 1; i < nums.size(); ++i) {
while (!pq.empty() && pq.top().second < i - k) {
pq.pop();
}
int sum = nums[i];
if (!pq.empty()) {
sum += pq.top().first;
}
dp[i] = sum;
pq.push({dp[i], i});
maxSum = max(maxSum, dp[i]);
}
return maxSum;
}
int main() {
vector<int> nums = {10, 2, -10, 5, 20};
int k = 2;
cout << constrainedSubsequenceSum(nums, k) << endl;
return 0;
}C++ uses a max-heap (priority queue) to track potential maxima. It provides a compact way to check out the maximums across a moving window efficiently.