1911. 最大子序列交替和

245 阅读1分钟

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

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

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

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

算法:
方法一:动态规划
状态转移方程:
dp[i][0]表示前i个树中,长度为偶数的子序列最大交替和,
dp[i][1]表示前i个树中,长度为奇数数的子序列最大交替和。
dp[i][0] = max(不选第i + 1个数,选择第i + 1个数)
= max(dp[i - 1][0], dp[i - 1][1] - nums[i])
dp[i][1] = max(不选第i + 1个数,选择第i + 1个数)
= max(dp[i - 1][1], dp[i - 1][0] + nums[i])

初始化dp[-1][0] = 0, dp[-1][1] = math.MinInt64

func maxAlternatingSum(nums []int) int64 {
    f := [2]int{0, math.MinInt64 / 2}
    for _, v := range nums {
        f = [2]int{max(f[0], f[1] - v) , max(f[1], f[0] + v)}
    }
    return int64(max(f[0], f[1]))
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}