/* 算法描述:维护一个s[p]表示累加和 并且更新最大值ans 如果s[p]<0 则从p+1重新累加 证明:设某个区间的起点和终点分别为s t 分两种情况 1.t<p:设s2表示1到s的累加和 s1表示s到t的累加和 s3表示1到t的累积和 根据前面的条件 s2>0 s1=s3-s2 所以有s3>s1 即 从1开始更优 2. t>=p:设s2表示1到p的累加和 s1表示1到s的累加和 s3表示s到p的累积和 根据前面的条件 s1>0 s2<0 s2=s1+s3 所以有 s3<0 设s4表示p到t的累加和 s5表示s到t的累加和 有s5=s4+s3 又因为s3<0 所以s5>s4 即s[p]<0 时 重新;累加更优 */ #include<iostream> #include<cstring> using namespace std; int n,a[100010],ans=-999999,s; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; ans=max(ans,a[i]);//防止出现全部为负数 } for(int i=1;i<=n;i++) { s=s+a[i]; if(s<0)s=0; else ans=max(ans,s); } cout<<ans; return 0; }