DeepSeek LeetCode 1425.带限制的子序列和 public int constrainedSubsetSum(int[] nums, int k)
以下是 LeetCode 1425「带限制的子序列和」的 Java 解法使用动态规划 单调队列实现时间复杂度 O(n)空间复杂度 O(n)。javapublic int constrainedSubsetSum(int[] nums, int k) {int n nums.length;int[] dp new int[n]; // dp[i] 表示以 i 结尾的子序列的最大和DequeInteger dq new ArrayDeque(); // 单调队列存储索引按 dp 值递减int ans Integer.MIN_VALUE;for (int i 0; i n; i) {// 移除窗口外的索引while (!dq.isEmpty() dq.peekFirst() i - k) {dq.pollFirst();}// 获取前 k 个位置的最大 dp 值负数则取 0int maxPrev dq.isEmpty() ? 0 : Math.max(0, dp[dq.peekFirst()]);dp[i] nums[i] maxPrev;ans Math.max(ans, dp[i]);// 维护单调递减队列while (!dq.isEmpty() dp[dq.peekLast()] dp[i]) {dq.pollLast();}dq.offerLast(i);}return ans;}算法思路· 定义 dp[i] 为必须选择 nums[i] 时以 i 结尾的子序列的最大和。· 转移方程dp[i] nums[i] max(0, max(dp[j]))其中 i - k ≤ j i。· 使用单调递减队列维护窗口内 dp 值队首即为窗口内最大 dp 值。· 最终答案取所有 dp[i] 的最大值。注意事项· 允许子序列只包含当前元素即不加任何前面的元素因此 maxPrev 需要与 0 比较。· 若所有数均为负数答案即为最大元素因为只选一个元素的情况会被考虑。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2495664.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!