最长子段和

最长子段和可以通过确定 起点和终点 来得到

起点:   起点的划分判断:之前的累加和为负,另起新段。

终点:   每次子段增长时,比较新值,保存最大值。

#include<iostream>
using namespace std;

int n[100000];

int main()
{
    int cou;
    cin>>cou;
    for(int u=0;u<cou;u++)
    {
        cin>>n[u];
    }

    int max=n[0];  // max为最长子段和
    int tem=n[0];  // tem为 当前子段中 最长的和
    int m=n[0];    // m为 当前子段的  累加和


    for(int i=1;i<cou;i++)
    {
        
        if(n[i]>0)  // n[i]>0时有可能发生 两个最长和 的状态改变;否则直接累加
        {
            if(m<0) { if(tem>max) max=tem;   m=n[i]; tem=m; continue; }  // m<0代表 对当前数 来说 ,前面的累加和 不如不加;

                                                                                              // 因此以这个数为起点, 开始一个新的子段;同时更新最长和状态
        
            m=m+n[i];                                                    

            if(m>tem) { tem=m; }

    
        }
        else
        {
           m=m+n[i];
            
        }

    }

    if(tem>max) max=tem; 

    cout<<max<<endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u013595395/article/details/83719293