2023.7.11 最大子序列交替和
一个玄学经验,涉及到子序列
的题,通常都是用dp解,所以看到这题,我就直接用dp思路来入手了。
状态定义:f[i][0]
为以下标i为结尾,且最后一个下标为偶数的子序列最大交替和。f[i][1]
类似,只不过最后一个下标为奇数。
状态转移:
f[i][0] = max(nums[i], f[k][1] + nums[i])
,找到前面最大的一个值,假设其为f[k][1]
,那么比较加上他和不加上他哪个更大。f[i][1]
= max(f[k][0]) - nums[i]。奇数下标的话,必须得找到一个最大点的偶数下标值来减。
在状态转移过程中记录出现过的最大值,即为答案。
use std::cmp::max;
impl Solution {
pub fn max_alternating_sum(nums: Vec<i32>) -> i64
{
let n = nums.len();
let mut res = nums[0] as i64;
let (mut odd, mut even) = (-0x3f3f3f3f_i64, nums[0] as i64);
for x in nums.into_iter().skip(1).take(n - 1) {
let x = x as i64;
let mut st0 = max(odd + x, x);
let mut st1 = even - x;
res = max(res, max(st0, st1));
odd = max(odd, st1);
even = max(even, st0);
}
res
}
}