Leetcode 1425: DP + 单调队列

  1. Constrained Subsequence Sum
    Hard

Given an integer array nums and an integer k, return the maximum sum of a non-empty subsequence of that array such that for every two consecutive integers in the subsequence, numsi and numsj, where i < j, the condition j - i <= k is satisfied.

A subsequence of an array is obtained by deleting some number of elements (can be zero) from the array, leaving the remaining elements in their original order.

Example 1:

Input: nums = 10,2,-10,5,20, k = 2

Output: 37

Explanation: The subsequence is 10, 2, 5, 20.

Example 2:

Input: nums = -1,-2,-3, k = 1

Output: -1

Explanation: The subsequence must be non-empty, so we choose the largest number.

Example 3:

Input: nums = 10,-2,-10,-5,20, k = 2

Output: 23

Explanation: The subsequence is 10, -2, -5, 20.

Constraints:

1 <= k <= nums.length <= 105

-104 <= numsi <= 104

解法1:DP。会超时。

cpp 复制代码
class Solution {
public:
    int constrainedSubsetSum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> dp(n, INT_MIN / 3);
        dp[0] = nums[0];
        int res = dp[0];
        for (int i = 1; i < n; i++) {
            dp[i] = nums[i];
            for (int j = 1; j <= k; j++) {
                
                if (i >= j) {
                    dp[i] = max(dp[i], dp[i - j] + nums[i]);
                }       
            }
            res = max(res, dp[i]);
        }
       
        return res;
    }
};

解法2:DP+单调队列。注意单调队列本身就是一个滑动窗口。

cpp 复制代码
class Solution {
public:
    int constrainedSubsetSum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> dp(n, INT_MIN / 3);
        dp[0] = nums[0];
        int res = dp[0];
        deque<int> dq;
        dq.push_back(0);
        for (int i = 1; i < n; i++) {
            while (!dq.empty() && i - dq.front() > k) dq.pop_front(); 
            dp[i] = max(nums[i], dp[dq.front()] + nums[i]);
            while (!dq.empty() && dp[dq.back()] < dp[i]) dq.pop_back();
            dq.push_back(i);
            res = max(res, dp[i]);
        }
        return res;
    }
};
相关推荐
KaMeidebaby4 分钟前
卡梅德生物技术快报|基因测序技术在 46,XY 性发育障碍变异筛查中的流程与数据分析
服务器·前端·数据库·人工智能·算法·数据挖掘·数据分析
ZengLiangYi6 分钟前
SourceAdapter 插件架构详解
javascript·算法·架构
妄想出头的工业炼药师14 分钟前
特征检测和特征筛选
算法·开源
cxr82816 分钟前
高分子复合材料 AI 逆向设计合——学证明、算法实现、验证数据与学术资源全集
人工智能·线性代数·算法
ZengLiangYi23 分钟前
如何解析 5 种完全不同格式的 AI 对话
javascript·人工智能·算法
计算机安禾28 分钟前
【算法设计与分析】第29篇:启发式与元启发式搜索方法综述
java·数据库·算法
我叫袁小陌29 分钟前
数据结构详解与算法关联指南
算法
sleven fung30 分钟前
llama-cpp-python 本地部署入门
开发语言·python·算法·llama
头歌实践平台31 分钟前
C++面向对象 - 运算符重载的应用
开发语言·c++·算法
晚风予卿云月39 分钟前
《二分答案》算法练习
数据结构·c++·算法·二分·竞赛·算法随笔