这是一道枚举经典题。

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

本题解中统一设最大和为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. sql查询 ——排序

    -- 排序 -- order by 排序 默认为升序 -- asc 升序 -- desc 降序 -- 查询身高 分别用升序和降序 select *from student order by high ...

  2. Percona Xtrabackup 备份工具

    生成备份 $ xtrabackup --backup --target-dir=/data/backups/ 注:--target-dir可以放在my.cnf配置文件中.如果指定的目录不存在,xtra ...

  3. hash类型的应用场景 —— Redis实战经验

    hash类型是一个string类型的field和value的映射表,每个 hash 可以存储 232 - 1 键值对(40多亿),hash类型主要有以下应用场景. 1. 购物车 以用户id为key,商 ...

  4. 1.python数据类型详解

    python数据类型分类 1).数值型:整数型(int).浮点型(float).布尔型(bool 取值:True.False) 2).容器类型 : 字符串型(str).列表(list).元祖(tupl ...

  5. Docker Compose 启动mysql,redis,rabbitmq

    这里使用的centos7,首先切换到root. sudo -s 首先去设置下载镜像,否则下载这三个东西要很久,而且可能失败. vim /etc/docker/daemon.json 内容如下: { & ...

  6. Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

    我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...

  7. 剑指offer-面试题53_3-数组中数值和下标相等的元素-二分查找

    /* 题目: 求单调递增数组中,数值与下标相等的任意数字. */ /* 思路: 二分法. */ #include<iostream> #include<cstring> #in ...

  8. eclipse maven jdk1.8 还原站点项目红感叹号总是小结

    问题背景有三 maven 默认是jdk1.5jdk1.8 目录文件夹不全操作: 在项目上右击-> build path-->config build path-->libraries ...

  9. PS_0001:改变图片颜色 填充颜色

    1,创建新图存  ctrl + j 2,点击前景色按钮,改变颜色 3,前景色的键盘快捷键是“Alt+Delete”,背景色的键盘快捷键是“Ctrl+Delete”

  10. E11000 duplicate key error index: test.collection.$a.b_1 dup key: { : null } 报错记录

    这个一般分为两种情况,第一新增数据出现约束.而你在orm里面写了唯一约束.这种情况就比较简单,添加数据时保证数据字段唯一性就好了. 第二种情况比较难找,因为你发现你在orm里面并没有写约束,但是还是插 ...