算法思想:
设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);
最大子序列和算法
本文介绍了一种寻找一维数组中最大子序列和的高效算法,并提供了对应的代码实现。该算法利用了动态规划的思想,时间复杂度为O(N),同时讨论了如何确定最大子序列的起始与结束位置。
652

被折叠的 条评论
为什么被折叠?



