题解 【洛谷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 ...
随机推荐
- Jstree在加载时和加载完成的回调方法-sunziren
1.有时候在使用jstree的时候我们想在它加载完成后立刻执行某个方法,于是我们可以用下面这个jstree自带的回调: .on('ready.jstree', function(event, obj) ...
- W25Q64BV(FLASH)(SPI)中文手册
64兆位串行SPI FLASH存储器 1.常规介绍 W25Q64BV(64兆位)串行FLASH存储器为一个空间大小,引脚,功耗限制的系统提供解决方案.25Q系列的灵活性和性能良好超越了普通的串行FLA ...
- 第7章.字符串、String类和StringBuilder类
参考链接: https://www.runoob.com/csharp/csharp-string.html https://www.cnblogs.com/cang12138/p/7323709.h ...
- cf1131D
题意:总共有n+m个点,每一个点都有一个val,给出一个n*m的矩阵,矩阵中第i行第j列的为=,表示 i 点 和 j+n个点的值相等,<表示i 点比j+n个点的值小,> 刚好相反 要求用最 ...
- Qt读写文件
1.头文件 #include<QFile> #include<QFileDialog> #include<QDataStream> 2.写代码前工作 在ui界面拖入 ...
- P1089题解 津津的储蓄计划
来水一篇题解 #include <iostream> using namespace std; int main() { int month[12]; int mother=0,have= ...
- 洛谷题解 P1134 【阶乘问题】
原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...
- nginx解决服务器宕机、解决跨域问题、配置防盗链、防止DDOS流量攻击
解决服务器宕机 配置nginx.cfg配置文件,在映射拦截地址中加入代理地址响应方案 location / { proxy_connect_timeout 1; proxy_send_timeout ...
- 聊聊SNMP协议
注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/snmp-protoco ...
- 思科命令 service password-encryption
service password-encryption 将会把所有password用思科私有方式加密, 标记是 7,show run 查看密码时,5为md5加密结果即secret, no servic ...