**题目: **
一个下标从 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
}