刚开始还以为把数组复制一份接在后边求最大子段和呢,结果wa。。。然后就想了想两重循环,看数据量这样肯定会超时。。就去看看讨论版,思路很简单,可是想不到啊。。。
摘自讨论版:
答案有两种形式1.正常的最大连续序列2.开始在尾,结束的首第一种正常求,第二种考虑答案的组成,开始的一段+到结尾的一段,那么中间为什么去掉呢,因为中间那段和为负数,只要求出负数最大的子段和去掉就行了max(ans1,sum+ans2);
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAXN = 50010;
ll num;
int main()
{
//freopen("in","r",stdin);
int n;
cin >> n;
ll total = 0;
ll sum1=0;
ll sum2=0;
ll minn = 1e9;
ll maxn = -1e9;
for(int i = 0; i < n; ++i)
{
cin >> num;
total += num;
sum1 += num;
sum2 += num;
if(sum1 < 0)
sum1 = 0;
if(sum2 > 0)
sum2 = 0;
if(sum1 > maxn)
maxn = sum1;
if(sum2 < minn)
minn = sum2;
}
cout << max(maxn,total-minn) <<endl;
return 0;
}