01-复杂度2 Maximum Subsequence Sum(最大子列和在线法求解)

(比较懒,英文版原题就不翻译了,我等小白借助有道词典读题的)原题要求输出最大子列和、最大和的子列第一个数和最后一个数,有并列和的情况输出最小下标。多次尝试后一直有一个并列和相同i不同j,即尾0。的测试通不过,睡了一觉理解了,这个测试点的情况为,存在两个最大和子列,且间隔一个sum=0:具体为:

10

-10 1 2 3 4 -10 3 7 0 -21

#include <stdio.h>
int main(int argc,char const *argv[]){
    int sum=0,num=0,max=-1,k=0,flag=0; //sum=当时和、num=读取值、max=最大和、k=读取次数、flag=负数读取开关
    int first=0,last=0,temp=0,p=0;//first=最大和子列的第一个值、last=最大和子列的最后一个值、temp=当时和的第一个值、p=读取的第一个值
    scanf("%d",&k);
    int i=k;                              //用i控制读取次数,方便记录某次读取值,本程序中是为了记录全负数情况下第一个读取值p
    while(i--){
        scanf("%d",&num);
        if(i==k-1) p=num;
        if(num>=0||flag==1){    //当第一次读取大于等于0的值,开始累加;
            if(flag==0) temp=num;         //flag==0,说明此时sum==0,读取的第一个temp记录读取的第一个非负数
            sum+=num;                         //累加
            flag=1;                       //打开开关,下个值无论正负或0都应该读取
            if(sum>max){
                max=sum;
                first=temp;               //当sum大于max,更新max,更新first,更新last
                last=num;
            }
            if(sum<0){
                sum=0;                    //当时和小于0时,无法增大后面的和,舍弃,sum=0;flag关闭负数读取开关,跳过负数读取。
                flag=0;
            }
        }
    }
    if(max==-1){
        max=0;
        first=p;
        last=num;
    }
    printf("%d %d %d",max,first,last);
    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值