2023-07-11 LeetCode每日一题(最大子序列交替和)

2023-07-11每日一题

一、题目编号

1911. 最大子序列交替和

二、题目链接

点击跳转到题目位置

三、题目描述

一个下标从 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 <= 105
  • 1 <= nums[i] <= 105

四、解题代码

class Solution {
    
    
public:
    long long maxAlternatingSum(vector<int>& nums) {
    
    
        int n = nums.size();
        long long dp[100010][2];
        memset(dp, 0, sizeof(dp));
        dp[0][0] = nums[0];
        for(int i = 1; i < n; ++i){
    
    
            dp[i][0] = max(dp[i - 1][1] + nums[i], dp[i - 1][0]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - nums[i]);
        }
    return dp[n-1][0];
    }
};

五、解题思路

(1) 这道题目采用动态规划来解决问题。

(2) 首先先设置状态,dp[i][j],i的取值范围是0到n-1,j的取值范围是0和1。dp[i][0]的意思是,从下标0到下标i的子数组中,最后一个数字下标是偶数的最大交替和。dp[i][1]的意思是,从下标0到下标i的子数组中,最后一个数字下标是奇数的最大交替和。接着我们要设置初始状态,如果只有一个数字,那么一定是偶数下标,那么dp[i][0] = nums[0],dp[i][1] = 0即可设置初始状态。

(3) 那么下面进行最重要的状态转移。当i 大于 0的时候,dp[i][1] 就等于dp[i-1][0] - nums[i]和dp[i-1][1]的最大值,dp[i][0]就等于dp[i-1][0]和dp[i-1][1] + nums[i]的最大值。

(4) 进行完状态转移后,只需要返回dp[n-1][0]即可解决问题。

猜你喜欢

转载自blog.csdn.net/qq_56086076/article/details/131651706
今日推荐