LeetCode每日一题3165---不包含相邻元素的子序列的最大和

一、题目描述

给你一个整数数组 nums 和一个二维数组 queries,其中 queries[i] = [posi, xi]。

对于每个查询 i,首先将 nums[posi] 设置为 xi,然后计算查询 i 的答案,该答案为 nums 中 不包含相邻元素 的
子序列
的 最大 和。

返回所有查询的答案之和。

由于最终答案可能非常大,返回其对 109 + 7 取余 的结果。

子序列 是指从另一个数组中删除一些或不删除元素而不改变剩余元素顺序得到的数组。

示例 1:

输入:nums = [3,5,9], queries = [[1,-2],[0,-3]]

输出:21

解释:
执行第 1 个查询后,nums = [3,-2,9],不包含相邻元素的子序列的最大和为 3 + 9 = 12。
执行第 2 个查询后,nums = [-3,-2,9],不包含相邻元素的子序列的最大和为 9 。

示例 2:

输入:nums = [0,-1], queries = [[0,-5]]

输出:0

解释:
执行第 1 个查询后,nums = [-5,-1],不包含相邻元素的子序列的最大和为 0(选择空子序列)。

提示:

1 <= nums.length <= 5 * 104
-105 <= nums[i] <= 105
1 <= queries.length <= 5 * 104
queries[i] == [posi, xi]
0 <= posi <= nums.length - 1
-105 <= xi <= 105

二、解题思路
要解决这个问题,我们可以使用动态规划来计算不包含相邻元素的子序列的最大和。在处理每个查询时,我们需要更新数组 nums 并重新计算最大和。以下是解决此问题的基本步骤和思路:

定义动态规划状态:
我们定义 dp[i] 为考虑前 i 个元素时,不包含相邻元素的子序列的最大和。
状态转移方程为:
dp[i]=max(dp[i−1],dp[i−2]+nums[i])
这里 dp[i-1] 是不选择当前元素 nums[i] 的最大和,而 dp[i-2] + nums[i] 是选择当前元素后的最大和。
2. 初始化状态:

  • dp[0] = \max(0, nums[0]) (如果第一个元素是负数,选择空子序列)
  • dp[1] = \max(dp[0], nums[1]) (第一或第二个元素)

计算数组的初始值:

在处理所有查询之前,首先计算给定 nums 的初始状态。
处理查询:

对于每个查询,将特定位置的值更新到新的值,然后重新计算 dp。

三、代码


class Solution {
   
    int mod=(int)1e9+7;
    public int maximumSumSubsequence(int[] nums, int[][] queries) {
   
        SegTree st=new SegTree(0,nums.length
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韭菜盖饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值