一、问题描述

给定由n个整数组成的序列(a_1,a_2,…,a_n),最大子段和问题要求该序列形如

的最大值(1≤i≤j≤n),当序列中所有整数均为负整数时,其最大子段和为0。

例如,序列(-20, 11, -4, 13, -5, -2)的最大子段和为:

注意:必须是连续整数的和。

二、分治策略

(1)划分

–按照平衡子问题的原则,将序列(

,
,…,
) 划分成长度相同的两个子序列(
,…,
)和(
,…,
),则会出现以下三种情况:

,
,…,
的最大子段和 =
,…,
的最大子段和;

,
,…,
的最大子段和 =
,…,
的最大子段和;

,
,…,
的最大子段和 =
, 且1≤i≤⌊
⌋ , ⌊
⌋+1≤j≤n

(2)求解子问题

对于划分阶段的情况①和②可递归求解

对情况③,分别计算

为情况③的最大子段和。

(3)合并

–比较在划分阶段的三种情况下的最大子段和,取三者之中的较大者为原问题的解。

步骤示意图

三、算法实现

  int MaxSum(int a[ ], int left, int right){sum=0;if (left= =right) {      //如果序列长度为1,直接求解if (a[left]>0) sum=a[left];else sum=0;}else {center=(left+right)/2;    //划分leftsum=MaxSum(a, left, center);                //对应情况①,递归求解rightsum=MaxSum(a, center+1, right);      //对应情况②,递归求解s1=0; lefts=0;              //以下对应情况③,先求解s1for (i=center; i>=left; i--) {lefts+=a[i];if (lefts>s1) s1=lefts;}s2=0; rights=0;             //再求解s2for (j=center+1; j<=right; j++) { rights+=a[j];if (rights>s2) s2=rights;}sum=s1+s2;              //计算情况③的最大子段和 if (sum<leftsum) sum=leftsum;  //合并,在sum、leftsum和rightsum中取较大者if (sum<rightsum) sum=rightsum;}return sum;
}

思考:采用分治法求解(-20,11,-4,13,-5,-2)的最大子段和, 写出求解过程。

四、时间复杂度分析

对应划分得到的情况①和②,需要分别递归求解;

对应情况③,两个并列for循环的时间复杂性是O(n),所以,存在如下递推式:

综上,时间复杂性为O(nlog2n)。

内容有待完善,请客官等待更新!

最大子序列求和_算法——求最大子段和相关推荐

  1. 最大子序列求和_最大子序列和问题  一步一步到最优

    在<数据结构和算法分析 C++描述>上看到了一个例子.看过之后,我就在想,这是怎么一步一步的递推出来的,想了好长时间,才整理成这篇博文. 问题描述: 给定一个整数序列,a0, a1, a2 ...

  2. 最大子序列求和_最大子序列和问题

    问题描述: 给定一个整数序列,a0, a1, a2, -- , an(项可以为负数),求其中最大的子序列和.如果所有整数都是负数,那么最大子序列和为0: 例如:对于序列-2, 11, -4, 13, ...

  3. 最大子序列求和_连续子序列最大和与乘积问题的分析

    问题描述 给定(可能是负的)整数序列A1, A2,...,AN, 寻找(并标识)使Sum(Ak)(k >=i, k <= j)的值最大的序列.如果所有的整数都是负的,那么连续子序列的最大和 ...

  4. 求最大和 java_三种算法求最大子段和问题——Java实现

    给定由n个整数组成的序列(a1, a2, -, an),求该序列的子段和的最大值,当所有整数均为负整数时,其最大子段和为0. LargestSubsegmentSum1.java //蛮力算法 imp ...

  5. 最大子序列求和_最大连续子序列和

    题外话:本文原文是之前在知乎专栏写的一篇文章,现在读来发现好多地方没有写清楚,所以现在做了些修改,希望把分析过程说的更明白一些.为什么要发布到慕课网来呢,主要是因为个人认为这里的IT氛围更好更专业. ...

  6. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  7. c 最大子序列和_算法总结:左神class8—跳台阶+最长递增公共子序列

    [跳台阶]有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法? public int s1(int n){ if (n< 1){ return 0; if(n == 1 || n ...

  8. 算法:最大子序列求和问题

    最大子序列求和是指给定一组序列,求所有连续子序列的和中的最大值,例如给定数列: [5,-2,-5,6]最大子序列和是6:[1, 2, -3, 4, -5, 6, 7, 8, -9, 10]最大子序列和 ...

  9. JAVA编写一个函数计算1到n之和_编写一个求和函数,用以求1到n的和 ,并返回和值。_学小易找答案...

    [简答题]民宿 怎样做好个性化服务? (10.0分) [多选题]采取产品-市场集中化时,企业的目标市场( ) [单选题]So many mistakes in your homework! You m ...

最新文章

  1. C++11中std::future的使用
  2. 高防服务器租用:DDoS保护关键主题与防御保护性质
  3. Hadoop详解(六):MapReduce计算框架详解
  4. TF之DD:利用Inception模型+GD算法生成带背景的大尺寸、高质量的Deep Dream图片——五个架构设计思维导图
  5. 调用手机相机相册_如果你用华为手机拍照!记得开启专业模式,照片好看十倍不止...
  6. linux php7 安装redis扩展(php7可以使用自测)
  7. [导入]C++ GUi 选择
  8. 中文(英译) 爱情一句话哲理
  9. OpenJudge 8782 乘积最大——S.B.S
  10. 26章 OOP:宏伟蓝图
  11. ajaxsubmit php上传文件,使用ajaxSubmit方法实现多文件上传(异步)
  12. spss中有关独立样本T检验的详细介绍(包含操作过程和结果分析)
  13. 砥砺前行,匠心致远|袋鼠云联合创始人、易知微CEO宁海元荣获“数字工匠 ”
  14. 软件发布各版本代号含义
  15. 火影忍者的最爱:三勾玉
  16. ubuntu中如何修改计算机名字
  17. Linux内核设计与实现 第19章 可移植性
  18. 我的世界天空之城服务器位置,我的世界1.7.2服务器天空之城
  19. python生成迁移文件
  20. WxConn:统计微信好友数与加入群聊的人数

热门文章

  1. php 递归函数自调用函数,PHP闭包实现函数的自调用实现递归
  2. idea工作台输出的日志详解_详解linux下nohup日志输出过大问题解决方案--分批切割...
  3. mysql数据库 sid_jdbc连接数据库使用sid和service_name的区别
  4. Books Queries(codeforces 1066)
  5. linux 没有权限登录,CentOS中让一个用户没有登录权限
  6. PAT_B_1013_Java(20分)
  7. python chrome headless_[技巧] chrome headless 爬虫抓取websoket 数据
  8. win7局域网共享设置_Win7系统打印机共享不了的设置方法思路!
  9. 成为解决计算机问题的利器,高中数学教学借助计算机的“翅膀”腾飞
  10. html中flash的使用,[转载]flash中可以使用的HTML标签[有用]