力扣1911. 最大交替子序列和

一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。

比方说,数组 4,2,5,3 的交替和为 (4 + 5) - (2 + 3) = 4 。

给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。

一个数组的 子序列 是从原数组中删除一些元素后(也可能一个也不删除)剩余元素不改变顺序组成的数组。比方说,2,7,44,2,3,7,2,1,4 的一个子序列(加粗元素),但是 2,4,2 不是。

示例 1:

输入:nums = 4,2,5,3

输出:7

解释:最优子序列为 4,2,5 ,交替和为 (4 + 5) - 2 = 7 。


代码

java 复制代码
class Solution {
    public long maxAlternatingSum(int[] nums) {
        long[][] dp = new long[nums.length][2];
        dp[0][0] = nums[0];
        dp[0][1] = Long.MIN_VALUE;
        for(int i=1;i<nums.length;i++){
            dp[i][0] = Math.max(dp[i-1][1]+nums[i], Math.max(nums[i],dp[i-1][0]));
            dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-nums[i]);
        }
        return Math.max(0,Math.max(dp[nums.length-1][0],dp[nums.length-1][1]));
    }
}

状态定义

我们定义 dp[i][j]:表示从前 i 个数中选择一个子序列,能得到的最大交替和。

其中 j 只有两个取值(0 或 1),代表子序列末尾元素的特性:

  • dp[i][0] :子序列的长度为奇数
    • 这意味着最后一个元素的下标是 偶数(0, 2, 4...)。
    • 根据题目要求,这个元素是用来 "加" 的。
  • dp[i][1] :子序列的长度为偶数
    • 这意味着最后一个元素的下标是 奇数(1, 3, 5...)。
    • 根据题目要求,这个元素是用来 "减" 的。

状态转移方程

对于第 i 个数 nums[i],我们永远有两个选择:选它 或者 不选它

(1) 更新 dp[i][0](末尾是加号的状态)
  • 如果不选 nums[i] :最大和维持前一个状态,即 dp[i-1][0]
  • 如果选 nums[i]
    • 它可以接在一个"减号状态"后面:dp[i-1][1] + nums[i]
    • 它也可以作为子序列的第一个元素 (下标为 0):nums[i]
  • 结论dp[i][0] = max(dp[i-1][0], dp[i-1][1] + nums[i], nums[i])
(2) 更新 dp[i][1](末尾是减号的状态)
  • 如果不选 nums[i] :最大和维持前一个状态,即 dp[i-1][1]
  • 如果选 nums[i]
    • 它必须接在一个"加号状态"后面:dp[i-1][0] - nums[i]
  • 结论dp[i][1] = max(dp[i-1][1], dp[i-1][0] - nums[i])

初始化

dp00 = nums0;

dp01 = Long.MIN_VALUE;

为什么dp00为nums0?万一nums0为负数呢,为什么dp00不初始化为Math.max(0,nums0)?

这里的关键在于dp数组的含义,我们定义dp数组为至少要选中一个数,因此dp00=nums0,而dp01不合法。至于一个数都不选的情况,直接放到return处判断,一个数不选就是0,不需要dp专门记录状态。

相关推荐
To_OC2 分钟前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师10 分钟前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水13 分钟前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_250137 分钟前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
阳明山水1 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾2 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
AI科技星2 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
大鱼>2 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
apcipot_rain3 小时前
某双非机试真题
算法
米尔的可达鸭4 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构