**原题链接**
##题目描述
  给出一段序列,选出其中连续且非空的一段使得这段和最大。
    **解法**:
      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 最大子序和的更多相关文章

  1. 最大子段和(洛谷P1115,动态规划递推)

    洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...

  2. 洛谷P1115 最大字段和【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1115 题意: 求给定数组的最大区间和. 思路: $dp[i][0]$表示以1~i的数组,不选i的最大字段和.$d ...

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

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

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

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

  5. 洛谷 P1115 最大子段和

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

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

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

  7. AC日记——最大子段和 洛谷 P1115

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

  8. 洛谷p1115 最大子段和

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

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

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

随机推荐

  1. centos6下filebeat多开问题

    centos6下filebeat多开问题 0. 场景 比如之前在用filebeat做收集,但是想新开一个实例把之前的日志全部重新导一遍,如果直接指定filebeat -c 是不行的,因为filebea ...

  2. 「雕爷学编程」Arduino动手做(32)——雨滴传感器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  3. 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  4. Rabbitmq 报错 nodedown

    问题描述 线上 rabbitmq 集群账号密码设置的过于简单,有一定的风险.在整改过程中发现,三台机器信息错乱,每台服务器执行rabbitmq 相关的命令就报错,Error: unable to co ...

  5. ambari hdp ssh链接错误

    错误信息: ERROR 2019-09-05 10:29:05,700 NetUtil.py:96 - EOF occurred in violation of protocol (_ssl.c:57 ...

  6. Java常用设计模式详解1--单例模式

    单例模式:指一个类有且仅有一个实例 由于单例模式只允许有一个实例,所以单例类就不可通过new来创建,而所有对象都默认有一个无参的构造函数可以创建对象,所以单例类不仅不能提供public的构造方法,还需 ...

  7. LA3942 Remember the Word

    题目链接:https://vjudge.net/problem/UVALive-3942 本篇是刘汝佳<算法竞赛入门经典——训练指南>的读书笔记(复述),详见原书 \(P209\) . 解 ...

  8. SPOJ687 Repeats

    本篇是罗穗骞<后缀数组——处理字符串的有力工具>的读书笔记. 知识点: 后缀数组.RMQ 解题思路: 枚举长度 \(L\),然后检查长度为 \(L\) 的子串最多能连续重复几次. 对于给定 ...

  9. 【MySQL】覆盖索引和回表

    先来了解一下两大类索引 聚簇索引(也称聚集索引,主键索引等) 普通索引(也成非聚簇索引,二级索引等) 聚簇索引 如果表设置了主键,则主键就是聚簇索引 如果表没有主键,则会默认第一个NOT NULL,且 ...

  10. Docker虚拟机配置手札(centos)

    一.Docker只支持CentOS7及以上系统,不支持6.x系统 二.yum安装Docker 1.安装相关环境和设置仓库 yum install -y yum-utils device-mapper- ...