算法思想:
设num[i]为和最大序列的起点,则如果num[i]是负的,那么它不可能代表最优序列的起点,因为任何包含num[i]作为起点的子序列都可以通过num[i+1]作起点而得到改进。
代码
int sum=0,maxsum=-1000; //考虑到序列全为负权的情况
for(int i=1;i<=n;i++) //n为序列长度
{
sum+=num[i];
if(sum>maxsum)
maxsum=sum;
if(sum<0)
sum=0;
}
//maxsum就是所求的最大子序列和
运行时间O(N)
若不仅要求求最大子序列和,还要求找出最大子序列和的区间,代码如下
int maxsum=-1000,sum=0,st,ed,count=1;
for(int i=1;i<=n;i++)
{
sum+=num[i];
if(sum>maxsum)
{
maxsum=sum;
ed=i; //每次maxsum更新其实也代表着区间终点的更新
st=count;
}
if(sum<0)
{
sum=0; count=i+1; //count其实表示的是每个子序列的初始位置
}
}
printf("%d %d %d",maxsum,st,ed);