题目:3196. 最大化子数组的总成本
思路:对于每个元素,除了第一个元素外,其余都可以选择是第偶数位还是奇数位,这样就可以决定是乘1还是-1。
状态f[i][0]:表示第i个元素是奇数位,也就是乘1时,区间[0,i]之间的和。
状态f[i][1]:表示第i个元素是偶数位,也就是乘–1时,区间[0,i]之间的和。
状态转移方程看注释
class Solution {
public:
long long maximumTotalCost(vector<int>& nums) {
int n=nums.size();
long long f[100010][2];
//预处理出第一个元素
f[0][1]=nums[0]-1;//不存在偶数位,所以-1,这样避免选取偶数位。
f[0][0]=nums[0];
for(int i=1;i<n;i++){
//第i个元素是奇数位时,可能是另外一个单独的子数组,也可能是是前一个数为偶数时的下一个元素。
f[i][0]=nums[i]+max(f[i-1][0],f[i-1][1]);
//第i个元素是偶数位时,那前一个元素必须是奇数位
f[i][1]=nums[i]*-1+f[i-1][0];
}
return max(f[n-1][0],f[n-1][1]);
}
};