由于题中只要求了subsequence 子序列的最大和(不是子串),那么这道题就不用做得太麻烦了。
简单维护一下最大不定前缀和即可。
坑点:题中只说全负数时直接取零,这意味着在序列中出现0是要记录的。
学习到了:
1、以后还是多注意下读题吧。多读一分钟,节约找bug时间10分钟。。。
2、第一次使用scanf(), 在PAT的诡异测评机下居然报警告!解决办法是
if(scanf()) {}
#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
int n;
if (scanf("%d", &n)) {};
vector<int> a(n);
for (int i = 0; i < n; i++)
{
if (scanf("%d", &a[i])) {};
}
int maxSum = -1, sum = 0;
int ind_s = 0, st = 0;
int ind_e = n-1 , ed = n-1;
for (int i = 0; i < n; i++)
{
if (!sum) st = i;
sum += a[i];
if (sum < 0)
{
sum = 0;
continue;
}
ed = i;
if (sum > maxSum)
{
maxSum = sum;
ind_s = st;
ind_e = ed;
}
}
printf("%d %d %d\n", ~maxSum?maxSum:0, a[ind_s], a[ind_e]);
return 0;
}