HDU

来源:互联网 发布:衣锦夜行的燕公子知乎 编辑:程序博客网 时间:2024/05/27 03:29

题意:

中文

思路:

维护前缀和,最小前缀和,可以计算出每个右端点的最大子序列。

代码:

#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;    }}