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

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

算法思想:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值