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]152. 乘积最大子序列(DP)

Leetcode-53.最大子序列和

leetcode 300. Longest Increasing Subsequence 最长递增子序列 (中等)

LeetCode 第516题:最长回文子序列

[JavaScript 刷题] DP - 最大子数组和, leetcode 79

dp-最大连续子序列的和