这是一道 动态规划加单调队列的题,重点加强单调队列知识的学习
回归本题,这个题中,动态规划的部分略去,状态转移方程可求
单调队列部分
1维护队头 if(i-sta.front() == k) sta.pop_front();
2维护队尾
while(!sta.empty() &&dp[sta.back()] <dp[i]) sta.pop_back();
sta.push_back(i);
3计算过程,动态规划
dp[i] = max(dp[sta.front()]+nums[i],nums[i]);
ans = max(ans,dp[i]);
/** @lc app=leetcode.cn id=1425 lang=cpp** [1425] 带限制的子序列和*/// @lc code=start
class Solution {
public:int constrainedSubsetSum(vector<int>& nums, int k) {vector<int> dp(nums.size(),0);dp[0] = nums[0];int ans = dp[0];deque<int> sta;sta.push_back(0);for(int i = 1;i<nums.size();i++){dp[i] = max(dp[sta.front()]+nums[i],nums[i]);ans = max(ans,dp[i]);if(i-sta.front() == k) sta.pop_front();while(!sta.empty() &&dp[sta.back()] <dp[i]) sta.pop_back();sta.push_back(i);}return ans;}
};
// @lc code=end