洛谷 P1115 最大子序和
**原题链接**
##题目描述
给出一段序列,选出其中连续且非空的一段使得这段和最大。
**解法**:
1、暴力枚举 时间:O(n^3)
2、简单优化 时间:O(n^2)
3、分治 时间:O(nlogn)
4、DP 时间:O(n)
分析与代码
解法1:暴力枚举 时间:O(n^3)
由题意很容易想到通过枚举子串首尾两端的位置
确定找出不同的子串,并把确定子串中的数逐一
相加求和,从中取最大值暴力解决。
代码
#include<iostream>
using namespace std;
const int N=100010;
int a[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int MaxSum=-(1<<30),ThisSum;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
ThisSum=0;
for(int k=i;k<=j;k++)ThisSum+=a[k];
MaxSum=max(MaxSum,ThisSum);
}
}
cout<<MaxSum<<endl;
return 0;
}
解法2:简单优化 时间:O(n^2)
简单思考可发现,解法1中做了很多次重复计算,
如下图:

当子序起始位置不变,末端移动的时候,ThisSum只会依次加上新的一个数。所以,
只需枚举子串首尾两端的位置,每次子序末端移动的时候,
新子序和等于ThisSum=ThisSum+a[j]即可。
代码
#include<iostream>
using namespace std;
const int N=1000010;
int a[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int MaxSum=-(1<<30),ThisSum=0;
for(int i=0;i<n;i++){
ThisSum=0;
for(int j=i;j<n;j++){
ThisSum+=a[j];
MaxSum=max(MaxSum,ThisSum);
}
}
return 0;
}
解法3:分治 时间:O(nlogn)
(未完待续......)
解法4:DP 时间:O(n)
其实,再深入思考,可以发现当枚举计算ThisSum<0
的时候,再去子序末端移动过后遇到的无论是正数
还是负数,当它加上ThisSum时都将小于它本身。所
以ThisSum<0时,可以看成0从头处理。但还有一种特
殊情况——原序列全是负数!!!
由此可以得出以下状态转移方程:
MaxSum=max( MaxSum , max(ThisSum+a[i],a[i])
整个过程只需扫一遍数组即可,所以T(n)=O(n)。
代码
#include<iostream>
using namespace std;
const int N=1000010;
int a[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
int MaxSum=-(1<<30),ThisSum=0;
for(int i=0;i<n;i++){
ThisSum+=a[i];
MaxSum=max(MaxSum,ThisSum);
if(ThisSum<0)ThisSum=0;
}
cout<<MaxSum<<endl;
return 0;
}
洛谷 P1115 最大子序和的更多相关文章
- 最大子段和(洛谷P1115,动态规划递推)
洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...
- 洛谷P1115 最大字段和【线性dp】
题目:https://www.luogu.org/problemnew/show/P1115 题意: 求给定数组的最大区间和. 思路: $dp[i][0]$表示以1~i的数组,不选i的最大字段和.$d ...
- 【刷题】洛谷 P1115 最大子段和
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...
- [DP]洛谷P1115最大子段和
题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一 ...
- 洛谷 P1115 最大子段和
P1115 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N ...
- 洛谷 - P1115 - 最大子段和 - 简单dp
https://www.luogu.org/problemnew/show/P1115 简单到不想说……dp[i]表示以i为结尾的最大连续和的值. 那么答案肯定就是最大值了.求一次max就可以了. 仔 ...
- AC日记——最大子段和 洛谷 P1115
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...
- 洛谷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 ...
随机推荐
- 简版在线聊天Websocket
序言 What is Webscoket ? websocket 应用场景 简版群聊实现 代码例子 小结 Webscoket Websokcet 是一种单个TCP连接上进行全双工通信的协议,通过HTT ...
- 9.4 Go 数据格式
9.4 Go 数据格式 1.1. msgpack格式 官方msgpack官网用一句话总结: It’s like JSON. but fast and small. 简单来讲,它的数据格式与json类似 ...
- 使用PHP得到所有的HTTP请求头
作者:老王 在PHP里,想要得到所有的HTTP请求头,可以使用getallheaders方法,不过此方法并不是在任何环境下都存在,比如说,你使用fastcgi方式运行PHP的话,就没有这个方法,所以说 ...
- mysql日志体系大盘点
MySql日志文件主要包含:错误日志.慢查询日志.事务日志.二进制日志等 Mysql的日志配置可以通过命令 show global variables like '%log%'; 执行的结果如下 &q ...
- Java入门以及使用IDEA安装和使用
目录 JAVA第一个程序 HelloWorld 可能会遇到的情况 JAVA程序运行机制 IDEA安装 什么是IDE IDEA介绍 IDEA下载 IDEA基本使用 关于一些创建项目的小tips JAVA ...
- 使用EditPlus根据指定字符批量换行,快速填充Postman请求参数键值对
1.当某个.ext格式的文件中的重复格式内容太多时,而又想要根据某个字符进行批量换行时,那么可以使用EditPlus进行批量换行. 在开发过程中就会经常遇到这种问题,比如把Url的请求参数,快速的填写 ...
- 网络编程杂谈之TCP协议
TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...
- 什么是cookie?
cookie是什么? 其实cookies是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络浏览行为有关,所以存储在你电脑上的cookies就好像你的一张身份证,你电脑上的cooki ...
- [ES6系列-05]字符串相关操作更方便
[原创] 码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 今天的内容是,关于 ES6 JavaScript ...
- C#中方法的静态和非静态
在代码中,给方法加上static就成为了一个静态的方法,然而静态方法是隶属于类的,由类名点出来! 不给方法加static就是一个非静态方法,非静态的方法,是隶属于对象的,需要把类实例化之后,用对象名去 ...