最大连续子序列和 最优起点算法

算法思想:

    设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);

猜你喜欢

转载自blog.csdn.net/ZCMU_2024/article/details/81409691