在所有的子数组中找到 删除一次操作或者不删除后的最大值(是计算当前子数组经过操作或者不操作的和,然后遍历所有子数组,找到最大值)
一想到最大值,又是所有子数组 大概率就是要用到动态规划
这题的思想和之前的真的特别像,一下子想不起来也不好找了,后续补上
/*
用dp[i][k]表示以arr[i]结尾的子数组删除k次后的最大值
当然我们要求 k = 0 或者 1
对dp[i][k]进行分析
dp[0][0] 就是arr[0]
dp[0][1] 不存在
接着 i > 0 分析
dp[i][0] = max(dp[i - 1][0] , 0) + arr[i] 需要注意的是如果某次子数组之和为负数,直接pass 紧接着的子数组最大和就是 该元素的值 也就是 0 + arr[i]
dp[i][1] = max(dp[i - 1][1] + arr[1] , dp[i - 1][0]) 删除一次,可能在之前的子数组就删了一次,那么直接在前者基础上加当前元素值,也可能删的是当前元素的值,那么最大值就是前子数组之和了
int dp00 = arr[0];
int dp01 = 0;
int ans;
for(int i = 1; i < n; ++i){
dp01 = max(dp01 + arr[i], dp00);
dp00 = max(dp00, 0) + arr[i]; //由于dp01 会用 上一次的dp00 所以更新后的dp00在dp01更新之前
ans = max(ans, max(dp00, dp01);
}
return ans;
*/
双厨狂喜!
题还是要勤刷!!!!!