**原题链接**
##题目描述
  给出一段序列,选出其中连续且非空的一段使得这段和最大。
    **解法**:
      1、暴力枚举 时间:O(n^3)
      2、简单优化 时间:O(n^2)
      3、分治 时间:O(nlogn)
      4、DP 时间:O(n)

分析与代码

  解法1:暴力枚举 时间:O(n^3)

    由题意很容易想到通过枚举子串首尾两端的位置

    确定找出不同的子串,并把确定子串中的数逐一

    相加求和,从中取最大值暴力解决。

代码

  1. #include<iostream>
  2. using namespace std;
  3. const int N=100010;
  4. int a[N];
  5. int main(){
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;i++)cin>>a[i];
  9. int MaxSum=-(1<<30),ThisSum;
  10. for(int i=0;i<n;i++){
  11. for(int j=i;j<n;j++){
  12. ThisSum=0;
  13. for(int k=i;k<=j;k++)ThisSum+=a[k];
  14. MaxSum=max(MaxSum,ThisSum);
  15. }
  16. }
  17. cout<<MaxSum<<endl;
  18. return 0;
  19. }

  解法2:简单优化 时间:O(n^2)

    简单思考可发现,解法1中做了很多次重复计算,

    如下图:

      

      当子序起始位置不变,末端移动的时候,ThisSum只会依次加上新的一个数。所以,

      只需枚举子串首尾两端的位置,每次子序末端移动的时候,

      新子序和等于ThisSum=ThisSum+a[j]即可。

代码

  1. #include<iostream>
  2. using namespace std;
  3. const int N=1000010;
  4. int a[N];
  5. int main(){
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;i++)cin>>a[i];
  9. int MaxSum=-(1<<30),ThisSum=0;
  10. for(int i=0;i<n;i++){
  11. ThisSum=0;
  12. for(int j=i;j<n;j++){
  13. ThisSum+=a[j];
  14. MaxSum=max(MaxSum,ThisSum);
  15. }
  16. }
  17. return 0;
  18. }

  解法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)。

代码

  1. #include<iostream>
  2. using namespace std;
  3. const int N=1000010;
  4. int a[N];
  5. int main(){
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;i++)cin>>a[i];
  9. int MaxSum=-(1<<30),ThisSum=0;
  10. for(int i=0;i<n;i++){
  11. ThisSum+=a[i];
  12. MaxSum=max(MaxSum,ThisSum);
  13. if(ThisSum<0)ThisSum=0;
  14. }
  15. cout<<MaxSum<<endl;
  16. return 0;
  17. }

洛谷 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. Spring全家桶之spring boot(五)

    Thymeleaf简介 Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#.PHP语言体系下也 ...

  2. fastadmin后台:选择视频并允许上传到服务器

    1.在对应方法的视图  “view/class/add.html" 中上传视频部分添加:data-mimetype="video/mp4" 2.在 ”applicatio ...

  3. Python之sys.arg[]的用法解释

    转载自:https://www.cnblogs.com/liangmingshen/p/8906148.html sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那 ...

  4. svn简单用法

    svn checkout  .. dir  ,选rw 的那个目录 svn up( update) svn add .. svn commit .. -m "add sth"  这里 ...

  5. Django视图函数函数之视图装饰器

    FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py from django.shortcuts import render def wrapper(f): def inner(*arg ...

  6. 12.1面向对象编程的介绍(oop):封装,继承,多态,访问私有属性

    #封装:内部对数据封装.作用:1.保护数据,防止被随意修改:2.使外部的程序不需要关注内部的构造:只需要提供接口给外部进行访问即可.#继承:一个类就相当于一个模板.通过父类,子类的方式实现不同角色的共 ...

  7. 25-12 空值处理(null值)

    --------------------空值处理--------------------- select * from TblStudent --查询所有年龄是null的同学学习信息 --null值无 ...

  8. Code Your First API With Node.js and Express: Set Up the Server

    How to Set Up an Express API Server in Node.js In the previous tutorial, we learned what the REST ar ...

  9. 【谎言大揭秘】Modin真的比pandas运行更快吗?

    最近看了某公众号文章,推荐了所谓的神器,据说读取速度吊打pandas,可谓牛逼,事实真是这样吗? 来一起揭秘真相. 首先安装包. # pip install ray # pip install das ...

  10. Linux下VCS2014和Verdi2015的联合使用

    VCS和Verdi是IC设计中常用的两款开发工具.VCS是Synopsys公司的产品,和大家所熟知的ModeSim一样的都是EDA仿真工具.Verdi是Nocas公司(已经被Synopsys公司收购) ...