最长子段和

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

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

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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值