题意:
中文
思路:
维护前缀和,最小前缀和,可以计算出每个右端点的最大子序列。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e4+7;
int a[MAXN]={0},b[MAXN]={0},c[MAXN];
int main()
{
int n;
while(scanf("%d",&n)&&n){
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=2;i<=n;i++) a[i]+=a[i-1];
b[1]=0;c[1]=1;
for(int i=2;i<=n;i++){
if(b[i-1]>=a[i-1]){
b[i]=a[i-1];
c[i]=i;
}else{
b[i]=b[i-1];
c[i]=c[i-1];
}
}
int ans=a[1],ansl=1,ansr=1;
for(int i=2;i<=n;i++){
if(a[i]-b[i]>ans){
ans=a[i]-b[i];
ansl=c[i];ansr=i;
}
}
if(ans>=0)
cout<<ans<<' '<<a[ansl]-a[ansl-1]<<' '<<a[ansr]-a[ansr-1]<<endl;
else
cout<<0<<' '<<a[1]-a[0]<<' '<<a[n]-a[n-1]<<endl;
}
}