涉及知识点:
solution:
- (祝大家周一愉快)
- (这个题目首先从数据范围我们知道,n^2的做法是不可取的)
- (所以我们应该想到一种O(n)的做法,或者是O(nlogn),或者更好的做法)
- (对于每个数我们都有被删除的可能性,所以对于当前的数字a[i],我们需要计算出这个数加上若干个前面连续的数的最大值)
- (比如 5,-9,10,6,-3的pre数组的值就是 5,-4,10,16,13)
- (那么我们计算出next也就很简单了, 12,7,16,6,-3)
- (那么我们再处理每个数删除情况就分为以下三种情况)
- (pre[i - 1] + Next[i + 1],pre[i - 1],Next[i + 1] 三者中的最大值)
std:
#include <iostream>
#include <algorithm>
#include <vector>
#include <sstream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int pre[N];
int Next[N];
int n;
int main()
{
cin >> n;
int res = -0x3f3f3f3f;
for(int i = 1;i <= n;i ++)
{
cin >> a[i];
}
int sum = 0;
for(int i = 1;i <= n;i ++)
{
sum += a[i];
res = max(res,a[i]);
pre[i] = max(a[i],sum);
if(sum < 0)sum = 0;
}
sum = 0;
for(int i = n;i >= 0;i --)
{
sum += a[i];
Next[i] = max(sum,a[i]);
if(sum < 0)sum = 0;
}
for(int i = 1;i <= n;i ++)
{
res = max({pre[i - 1] + Next[i + 1],pre[i - 1],Next[i + 1],res});
}
cout << res << endl;
return 0;
}