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]即可解决问题。