最长子段和可以通过确定 起点和终点 来得到
起点: 起点的划分判断:之前的累加和为负,另起新段。
终点: 每次子段增长时,比较新值,保存最大值。
#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;
}