前言:看到这个题目的时候我们可以用大顶堆记录前面的最大值,这样我们转移的时候就少了很多繁琐的查询
题目地址
class Solution {
public:int constrainedSubsetSum(vector<int>& nums, int k) {int n = nums.size();vector<int> ans = nums;priority_queue<pair<int,int>> q;q.push({nums[0],0});for(int i=1;i<n;i++){while(q.top().second+k<i){q.pop();}int u = q.top().first;if(u>0){ans[i] += u;}q.push({ans[i],i});}int t = nums[0];for(int i=1;i<n;i++){t = max(t,ans[i]);}return t;}
};