class Solution {
public:
long long maxAlternatingSum(vector<int>& nums) {
int n = nums.size();
vector<vector<long long int>> dp(n,vector<long long int>(2,0));
dp[0][0] = nums[0];
dp[0][1] = 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][0]-nums[i],dp[i-1][1]);
}
return max(dp[n-1][0],dp[n-1][1]);
}
};
思路:
动态规划:
仅有两个状态,加或者减,加地话那么当前就应该是偶数位次,那么上一次就是奇数位次。减地话那么当前就应该是奇数位次,上一次就是偶数位次
用dp[i][0]表示当前是偶数位次,dp[i][1]表示当前是奇数位次。
那么状态转移方程:
dp[i][0] = max(dp[i-1][1]+nums[i],dp[i-1][0]);
dp[i][1] = max(dp[i-1][0]-nums[i],dp[i-1][1]);
最后再取二者地较大值;
本文还可状态压缩,来减少空间复杂度。实现比较简单就不再提供源码了。