HDOJ 1003 Max Sum 杭电 ACM

本文分享了一种解决ACM编程挑战中最大子数组和问题的方法,通过使用额外数组来记录可能的最大值,提高了算法效率。文章详细介绍了如何避免使用不必要的数组,并确保解决方案的时间复杂度保持在O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题需要考虑很多不同的情况

曾经写过一个不用任何数组的AC版本 现在拿出来WA了 可见测试数据更新过

今天按原来的思路 加了个数组写了新版本AC了

数组s用来保存可能出现最大和的值 还要考虑其负值的可能性 加了之后便于找b(begin)

注意输出的坐标是首个出现的符合条件的串 就是要抓住所有前缀0 放弃所有后缀0 前缀0可能是若干正数开头的和为0的整数


以下代码若干步骤有多重考虑 复杂度仍控制在O(n)

#include<stdio.h>
int b,e,i,k,t,n,a,s[100001],m;
int main(){
    for(scanf("%d",&t),k=1;k<=t;++k){
        for(scanf("%d%d",&n,&a),m=s[0]=a,e=0,i=1;i<n;++i){
            scanf("%d",&a);
            if(s[i-1]>=0&&s[i-1]+a>=0)s[i]=s[i-1]+a;
            else s[i]=a;//s[i-1]<0时 无论a(可看作a[i])值多少 s[i]=a都合理 而且s再加上之前的和不可能成为最大值
            if(s[i]>m)m=s[i],e=i;//若出现多个最大值 end始终在第一个
        }
        for(i=e;i>=0;--i)
            if(s[i]<0)break;//若找不到s<0,任何情况都b=0
        b=m>=0?i+1:i,e++,b++;//being和end自增后可直接输出 m<0必有b=e
        printf("Case %d:\n%d %d %d\n%s",k,m,b,e,k<t?"\n":"");
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值