Problem: 1186. 删除一次得到子数组最大和

[TOC]

思路

动态规划

使用二维数组,一维数组里没个均含有不删除一个元素情况下的最大值,和删除了一个元素后的最大值,将着两个最大值进行对比,得到的就是答案的最大值;

递推关系为:

1
2
3
4
5
for(int i=1;i<n;i++){
dp[i][0]=max(dp[i-1][0],0)+arr[i];
dp[i][1]=max(dp[i-1][1]+arr[i],dp[i-1][0]);
mx=max(mx,max(dp[i][0],dp[i][1]));
}

dp[i][0]确定以i为结尾的前i个子数组的最大和;
dp[i][1]确定删除一个元素(被删除的元素是现在这个为dp[i-1][0],被删除元素为之前的某一个为dp[i-1][1]+arr[i])之后的前i个子数组的最大和。

确定以后与之前选取的最大值进行比较,选取现在值最大的数字

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

class Solution {
public:
int maximumSum(vector<int>& arr) {
int mx = arr[0];
int n=arr.size();
vector<vector<int>> dp(n,vector<int>(2,0));
dp[0][0]=arr[0];
dp[0][1]=0;
for(int i=1;i<n;i++){
dp[i][0]=max(dp[i-1][0],0)+arr[i];
dp[i][1]=max(dp[i-1][1]+arr[i],dp[i-1][0]);
mx=max(mx,max(dp[i][0],dp[i][1]));
}
return mx;
}
};