题解 【洛谷P1115】最大子段和
这是一道枚举经典题。
本题有三种做法,各位需要根据每个题的数据范围来决定自己用哪种方法。
本题解中统一设最大和为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】最大子段和的更多相关文章
- 洛谷 P1115 最大子段和
P1115 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N ...
- 【刷题】洛谷 P1115 最大子段和
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...
- [DP]洛谷P1115最大子段和
题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...
- 洛谷 - P1115 - 最大子段和 - 简单dp
https://www.luogu.org/problemnew/show/P1115 简单到不想说……dp[i]表示以i为结尾的最大连续和的值. 那么答案肯定就是最大值了.求一次max就可以了. 仔 ...
- 洛谷p1115 最大子段和
题目链接: 最大子段和 题目分析: 动态规划O(n)求解,设f[i]表示以i为终点的最大子段和 分两种情况: 若f[i-1]>0,则显然f[i]=f[i-1]+a[i](a[i]必须包含在内) ...
- 洛谷P1115 最大子段和【dp】
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iAi ...
- 洛谷——P1115 最大子段和
https://www.luogu.org/problem/show?pid=1115#sub 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件ma ...
- (Java实现) 洛谷 P1115 最大子段和
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA ...
- 洛谷P1115 最大子段和 (线性DP)
经典的线性DP例题,用f[i]表示以第i个位置结尾的最大连续子段和. 状态转移方程:f[i]=max(f[i],f[i-1]+a[i]); 这里省去了a数组,直接用f数组读数据,如果f[i-1]< ...
- Java实现 洛谷 P1115 最大子段和
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scann ...
随机推荐
- sql查询 ——排序
-- 排序 -- order by 排序 默认为升序 -- asc 升序 -- desc 降序 -- 查询身高 分别用升序和降序 select *from student order by high ...
- Percona Xtrabackup 备份工具
生成备份 $ xtrabackup --backup --target-dir=/data/backups/ 注:--target-dir可以放在my.cnf配置文件中.如果指定的目录不存在,xtra ...
- hash类型的应用场景 —— Redis实战经验
hash类型是一个string类型的field和value的映射表,每个 hash 可以存储 232 - 1 键值对(40多亿),hash类型主要有以下应用场景. 1. 购物车 以用户id为key,商 ...
- 1.python数据类型详解
python数据类型分类 1).数值型:整数型(int).浮点型(float).布尔型(bool 取值:True.False) 2).容器类型 : 字符串型(str).列表(list).元祖(tupl ...
- Docker Compose 启动mysql,redis,rabbitmq
这里使用的centos7,首先切换到root. sudo -s 首先去设置下载镜像,否则下载这三个东西要很久,而且可能失败. vim /etc/docker/daemon.json 内容如下: { & ...
- Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量
我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...
- 剑指offer-面试题53_3-数组中数值和下标相等的元素-二分查找
/* 题目: 求单调递增数组中,数值与下标相等的任意数字. */ /* 思路: 二分法. */ #include<iostream> #include<cstring> #in ...
- eclipse maven jdk1.8 还原站点项目红感叹号总是小结
问题背景有三 maven 默认是jdk1.5jdk1.8 目录文件夹不全操作: 在项目上右击-> build path-->config build path-->libraries ...
- PS_0001:改变图片颜色 填充颜色
1,创建新图存 ctrl + j 2,点击前景色按钮,改变颜色 3,前景色的键盘快捷键是“Alt+Delete”,背景色的键盘快捷键是“Ctrl+Delete”
- E11000 duplicate key error index: test.collection.$a.b_1 dup key: { : null } 报错记录
这个一般分为两种情况,第一新增数据出现约束.而你在orm里面写了唯一约束.这种情况就比较简单,添加数据时保证数据字段唯一性就好了. 第二种情况比较难找,因为你发现你在orm里面并没有写约束,但是还是插 ...