分析:求最大字段和,sum[i]表示以num[i] 结尾在1~i之间的最大和,sum[i]=(sum[i-1]+num[i]>num[i])?sum[i-1]+num[i]:num[i];最后,max = {sum[i],1<=i<=n} 。
代码如下:
#include<iostream>
using namespace std;
int num[100005];
int sum[100005];
int s_point[100005];
int case_num = 0;
int main() {
int t, n, end;
cin >> t;
while (t--) {
end = 1;
memset(num, 0, sizeof(num));
memset(s_point, 0, sizeof(s_point));
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> num[i];
}
sum[1] = num[1];
s_point[1] = 1;
for (int i = 2; i <= n; ++i) {
if (sum[i - 1] >= 0) {
sum[i] = sum[i - 1] + num[i];
s_point[i] = s_point[i - 1];
}
else {
sum[i] = num[i];
s_point[i] = i;
}
if (sum[i] > sum[i - 1]) {
end = i;
}
}
cout << "Case " << ++case_num << ":" << endl;
cout << sum[end] << " " << s_point[end] << " " << end << endl;
if (t) {
cout << endl;
}
}
}