Loading

2023.7.11 最大子序列交替和

image

一个玄学经验,涉及到子序列的题,通常都是用dp解,所以看到这题,我就直接用dp思路来入手了。

状态定义:f[i][0]为以下标i为结尾,且最后一个下标为偶数的子序列最大交替和。f[i][1]类似,只不过最后一个下标为奇数。
状态转移:

  1. f[i][0] = max(nums[i], f[k][1] + nums[i]),找到前面最大的一个值,假设其为f[k][1],那么比较加上他和不加上他哪个更大。
  2. 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
    }
}
posted @ 2023-07-11 15:49  烤肉kr  阅读(4)  评论(0编辑  收藏  举报