最大连续子序列和,也可以叫最大子串和。
参考以前这个,一模一样。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <queue>
using namespace std; // 呵呵,就当复习一遍
const int MAXN = 1e4;
int N;
int a[MAXN];
int p[MAXN]; // 存储以当前下标为尾的最大子序列的首元素下标
int sum[MAXN]; // 存储以当前下标为尾的最大子序列的和
void init()
{
}
int main()
{
for (; ~scanf("%d", &N);)
{
if (!N) break;
init();
for (int i = 0; i < N; i++)
scanf("%d", &a[i]);
bool flag = false;
for (int i = 0; i < N; i++)
{
if (a[i] >= 0) break;
if (i == N - 1)
{
printf("0 %d %d\n", a[0], a[N - 1]);
flag = true;
}
}
if (flag) continue;
p[0] = 0;
sum[0] = a[0];
for (int i = 1; i < N; i++)
{
sum[i] = a[i];
if (sum[i - 1] >= 0) // 这里取等号意味着获得更多的前0,这样i更小
{
sum[i] += sum[i - 1];
p[i] = p[i - 1];
}
else
{
p[i] = i;
}
}
int ans = -1, k;
for (int i = 0; i < N; i++)
{
if (sum[i] > ans) // 不要后0
{
ans = sum[i];
k = i;
}
}
printf("%d %d %d\n", ans, a[p[k]], a[k]);
}
return 0;
}