做题思路:
给出一个数组,求连续子序列的和的最大值。先预处理一个前缀和,方便取出某一段区间和,他既然要求最大连续值,那么端点的值必然大于等于零(注意这题有零要包含在序列里,题目没讲清楚,如果不包含的话,有个测试点过不了)。把所有可能的端点记录下来,枚举每个端点(最多要跑5e7个数据),取出最大的情况。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
const int N = 1e4 + 10;
ll s[N];
ll a[N], b[N];
int idx;
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]), s[i] = s[i - 1] + a[i];
for(int i = 1; i <= n; i ++ )
{
if(a[i] >= 0)
b[ ++ idx] = i;
}
if(idx == 0) return printf("0 %lld %lld", a[1], a[n]) & 0;
ll maxn = -1;
int l, r;
for(int i = 1; i <= idx; i ++ )
for(int j = i; j <= idx; j ++ )
if(s[b[j]] - s[b[i] - 1] > maxn)
{
maxn = s[b[j]] - s[b[i] - 1];
l = b[i], r = b[j];
}
printf("%lld %lld %lld", maxn, a[l], a[r]);
return 0;
}