这是一道 动态规划加单调队列的题,重点加强单调队列知识的学习
回归本题,这个题中,动态规划的部分略去,状态转移方程可求
单调队列部分
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