题解
典型最大子段和问题 求解时使用p数组记录最大子段和起点位置即可
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 10;
int a[MAXN], d[MAXN], p[MAXN]; //d当前位置的最大和 p当前位置最大和的起点
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int T;
cin >> T;
for (int ti = 1; ti <= T; ti++)
{
if (ti != 1)
cout << endl;
int N;
cin >> N;
for (int i = 1; i <= N; i++)
{
scanf("%d", &a[i]);
d[i] = a[i]; //默认不和前面的连在一起
p[i] = i; //起点为自身
if (d[i] <= d[i - 1] + a[i])
d[i] = d[i - 1] + a[i], p[i] = p[i - 1]; //如果连在一起则记录起点
}
int ans = -INF, a = 0, b = 0;
for (int i = 1; i <= N; i++)
if (ans < d[i])
ans = d[i], a = p[i], b = i;
a = max(a, 1); //解决起点为0
printf("Case %d:\n", ti);
printf("%d %d %d\n", ans, a, b);
}
return 0;
}