codevs2622数字序列( 连续子序列最大和O(n)算法)

/*
算法描述:维护一个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;
}

 

posted @ 2016-04-25 10:25  一入OI深似海  阅读(394)  评论(0)    收藏  举报