LeetCode5782. 最大子序列交替和(dp)
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode5782. 最大子序列交替和(dp)相关的知识,希望对你有一定的参考价值。
题意:
一个下标从 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] 不是。
数据范围:
1 <= nums.length <= 1e5
1 <= nums[i] <= 1e5
解法:
令d[i][0]表示前i个数,取的子序列末尾是+号时的最大值.
令d[i][1]表示前i个数,取的子序列末尾是-号时的最大值.
d[i][0]可以由d[i-1][0]或d[i-1][1]+a[i]转移的来.
d[i][1]可以由d[i-1][1]或d[i-1][0]-a[i]转移的来.
code:
const int maxm=2e5+5;
long long d[maxm][2];
class Solution {
public:
long long maxAlternatingSum(vector<int>& a) {
int n=a.size();
a.insert(a.begin(),0);
d[1][0]=a[1];
d[1][1]=0;
for(int i=2;i<=n;i++){
d[i][0]=max(d[i-1][0],d[i-1][1]+a[i]);
d[i][1]=max(d[i-1][1],d[i-1][0]-a[i]);
}
return max(d[n][0],d[n][1]);
}
};
以上是关于LeetCode5782. 最大子序列交替和(dp)的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 300. Longest Increasing Subsequence 最长递增子序列 (中等)