题目链接
题目解释
dp[i] = max(max(dp[i-1],[i-2],…,dp[i-k])+nums[i],nums[i])
但是如果每次都访问之前的数字,会有一个很明显的超时(n^2),因此,在这种情况下,需要用一个双队列来维护数组的前k个的最大值,从而每次只要取队首的元素,就可以直接进行计算.
代码
class Solution {
public:
int constrainedSubsetSum(vector<int>& nums, int k) {
int ans, n = nums.size();
deque<int> q;
q.push_back(0);
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
ans = dp[0];
for(int i = 1;i < n; i++){
int nx = q.front();
dp[i] = max(dp[nx] + nums[i], nums[i]);
ans = max(ans, dp[i]);
if(i - nx == k) q.pop_front();
while(!q.empty() && dp[i] > dp[q.back()]) q.pop_back();
q.push_back(i);
}
return ans;
}
};