这是一道枚举经典题。

本题有三种做法,各位需要根据每个题的数据范围来决定自己用哪种方法。

本题解中统一设最大和为Max。

方法一、 枚举子序列,从起点到终点求和。时间复杂度:O(n^3)

我们可以枚举它的子序列,也就是枚举它的长度、起点和终点。我们不妨设长度为i,起点为j,终点为k,当前子序列的和为s。于是我们就有了下列核心代码:


    Max=a[];//最大和初始化为第一个数
for(i=;i<=n;i++)//枚举长度
for(j=i;j<=n;j++){//枚举起点
s=;//当前序列和初始化为0
for(k=i;k<=j;k++)//枚举终点
s+=a[k];//计算和
if(s>Max)Max=s;//比较
}
printf("%d",Max);//输出

这种方法在时限1s的题目中只能通过n<=450的范围。

但是本题的序列长度n<=200000。

所以采用该方法超时。

方法二、先求前缀和,再枚举。时间复杂度:O(n^2)

我们可以先求出从第一个数到当前数的和,然后枚举起点和终点,计算每一个子序列的和。于是我们就有了下列核心代码:


    memset(s,,sizeof(s));//初始化前缀和
for(i=;i<=n;i++)s[i]=s[i-]+a[i];//计算前缀和
Max=a[i];//初始化最大值为第一个数
for(i=;i<=n;i++)
for(j=i;j<=n;j++)
Max=max(Max,s[j]-s[i-]);//枚举起点和终点。
//注意是i-1!因为计算从第i个数开始的和需要减去前i-1个数的和
printf("%d",Max);

怎么有点像DP?

这种方法在时限1s的题目中只能勉强通过n<=10000的范围。

但是本题的序列长度n<=200000。

所以采用该方法也超时。

方法三、直接从头开始计算和,并每次记录最大和。时间复杂度:O(n)

不妨设s为以第i个数结尾的最大和,并每次计算和。

若当前和比最大值大,就更新最大值。

若当前和比0小,就把和清0。

核心代码:


    scanf("%d",&n);
s=;
Max=-2e9;
for(i=;i<=n;i++){
scanf("%d",&a);
s+=a;
if(s>Max)Max=s;
if(s<)s=;
}
printf("%d",Max);

这种方法在时限1s的题目中能勉强通过n<=100000000的范围。

由于本题的序列长度n<=200000。

所以可以采用这种方法。

总结:一定要明白第三种方法的道理,并且能自己编写代码,这样水平才能有所提升。

题解 【洛谷P1115】最大子段和的更多相关文章

  1. 洛谷 P1115 最大子段和

    P1115 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N ...

  2. 【刷题】洛谷 P1115 最大子段和

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...

  3. [DP]洛谷P1115最大子段和

    题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...

  4. 洛谷 - P1115 - 最大子段和 - 简单dp

    https://www.luogu.org/problemnew/show/P1115 简单到不想说……dp[i]表示以i为结尾的最大连续和的值. 那么答案肯定就是最大值了.求一次max就可以了. 仔 ...

  5. 洛谷p1115 最大子段和

    题目链接: 最大子段和 题目分析: 动态规划O(n)求解,设f[i]表示以i为终点的最大子段和 分两种情况: 若f[i-1]>0,则显然f[i]=f[i-1]+a[i](a[i]必须包含在内) ...

  6. 洛谷P1115 最大子段和【dp】

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iAi ...

  7. 洛谷——P1115 最大子段和

    https://www.luogu.org/problem/show?pid=1115#sub 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件ma ...

  8. (Java实现) 洛谷 P1115 最大子段和

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA ...

  9. 洛谷P1115 最大子段和 (线性DP)

    经典的线性DP例题,用f[i]表示以第i个位置结尾的最大连续子段和. 状态转移方程:f[i]=max(f[i],f[i-1]+a[i]); 这里省去了a数组,直接用f数组读数据,如果f[i-1]< ...

  10. Java实现 洛谷 P1115 最大子段和

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scann ...

随机推荐

  1. 安装NFS到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:无 硬件要求:无 安装过程 1.配置YUM源 [root@localhost ~]# rpm -i https ...

  2. Quartz.NET - 教程 5: 简单触发器

    译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 5: SimpleTrigger 如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的 ...

  3. python类详细说明、常用内置方法和self的作用

    一.类的定义 在Python中,一切皆对象,即便是类本身,也是一种type类型的特殊对象. class Person: def __init__(self, name, age): self.name ...

  4. Apache Avro总结

    参考 Apache Avro™ 1.9.0 Specification Avro介绍 小而巧的数字压缩算法:zigzag   原始类型(Primitive Types) 类型名 描述 描述 二进制编码 ...

  5. Django基础一Web框架的本质

    我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求, ...

  6. ArchLinux下electronssr无法启动的解决措施

    ArchLinux下electronssr无法启动的解决措施 今天重新配置electron-ssr时发现闪退(无法启动). 于是开始查错 首先是找到了目录位置 /usr/electron-ssr/el ...

  7. mysql版本报错

    IntelliJIdea2019.3打开原项目报mysql版本报错: Error opening zip file or JAR manifest missing : /C:/Users/flycat ...

  8. CentOS7防火墙设置常用命令

    目录 开/关/重启防火墙 查看所有开启的端口号 CentOS7环境下防火墙常用命令 开/关/重启防火墙 查看防火墙状态 firewall-cmd --state 启动防火墙 systemctl sta ...

  9. 【spring boot】SpringBoot初学(3)– application配置和profile隔离配置

    前言 github: https://github.com/vergilyn/SpringBootDemo 说明:我代码的结构是用profile来区分/激活要加载的配置,从而在一个project中写各 ...

  10. source、sh、./执行脚本对变量的影响

    shell脚本中的变量: local一般用于局部变量声明,多在在函数内部使用. shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止. she ...