• 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;
    }
  • 相关阅读:
    洛谷 P1282 多米诺骨牌
    【2017杭二联考】穿越矩形
    【2017杭二联考】 图的有向环
    树状数组
    Test2014-3-1 魅力值比较
    NOI2007 货币兑换
    POI2001 金矿
    太空飞行计划问题
    Genotype&&陨石的秘密
    usaco 土地并购 && hdu 玩具装箱
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5429966.html
Copyright © 2020-2023  润新知