文章目录

  • 1 算法1
  • 2 算法2
  • 3 算法3(分治)
  • 4 算法4(在线处理,最快)

问题:
已知 一个整数序列a[n]:n个整数(有正负)
求 在这个序列的所有子序列(连续)中,最大的和是多少?

注意:
以下代码都要求最大和 【可为负数】,若要求最大和 【非负】,只需最后判断一下即可

1 算法1

#include<cstdio>using namespace std;// 整数序列a[n]
int max_subseq_sum1(int a[], int n){int max_sum=a[0];              // 所有 子序列中的最大和int this_sum;                 // 当前 子序列的和int i,j,k;for(i=0; i<n; i++){          // 以a[i]开头的所有子序列for(int j=i; j<n; j++){   // 子序列: a[i] ~ a[j]this_sum = 0;for(k=i; k<=j; k++){this_sum += a[k];}//if(this_sum > max_sum){max_sum = this_sum;}}}return max_sum;
}int main(){int a[5] = {-1, 10, 4, -10, 3};int max_sum;max_sum = max_subseq_sum1(a, 5);printf("%d\n", max_sum);return 0;
}

T(n)=O(n3)T(n) = O(n^{3})T(n)=O(n3)


2 算法2

// 整数序列a[n]
int max_subseq_sum2(int a[], int n){int max_sum=a[0];              // 所有 子序列中的最大和int this_sum;                 // 当前 子序列的和int i,j;for(i=0; i<n; i++){            // 以a[i]开头的所有子序列this_sum = 0;for(int j=i; j<n; j++){     // 子序列: a[i] ~ a[j]this_sum += a[j];//if(this_sum > max_sum){max_sum = this_sum;}}}return max_sum;
}

T(n)=O(n2)T(n) = O(n^{2})T(n)=O(n2)


3 算法3(分治)


//分治法求 a[left] ~ a[right]的最大子列和
int divide_conquer(int a[], int left, int right){int max_left_sum, max_right_sum;        // 左右子问题的解(最大和)int center;                             // 中间线int max_border_sum;                     // 跨分界线的解(最大和)int max_left_border_sum, max_right_border_sum;         // 跨分界线向左右扫描的最大和int this_left_border_sum, this_right_border_sum;/*递归终止*/if( left == right )  {                  // 子列只有1个数字return a[left];}/*分*/center = (left + right) / 2;// 1. 中间线左边 的最大子列和max_left_sum = divide_conquer(a, left, center);// 2. 中间线右边 的最大子列和max_right_sum = divide_conquer(a, center+1, right);// 3.跨中间线 的最大子列和max_left_border_sum=a[center];this_left_border_sum=0;for(int i=center; i>=left; i--){  //从中间线开始,向左扫描this_left_border_sum += a[i];if(this_left_border_sum > max_left_border_sum){max_left_border_sum = this_left_border_sum;}}max_right_border_sum=a[center+1];this_right_border_sum=0;for(int i=center+1; i<=right; i++){  //从中间线开始,向右扫描this_right_border_sum += a[i];if(this_right_border_sum > max_right_border_sum){max_right_border_sum = this_right_border_sum;}}max_border_sum = max_left_border_sum + max_right_border_sum;/*治*/return max(max(max_left_sum, max_right_sum), max_border_sum);
}// 整数序列a[n]
int max_subseq_sum3(int a[], int n){return divide_conquer(a, 0, n-1);
}

T(n)=O(nlogn)T(n) = O(nlogn)T(n)=O(nlogn)


4 算法4(在线处理,最快)

在线:每输入一个数据就进行即时处理,在任何一个地方中止输入,算法都能正确给出当前的解。

// 整数序列a[n]
int max_subseq_sum4(int a[], int n){int max_sum=a[0];                  // 所有 子序列中的最大和int this_sum=0;                  // 当前 子序列的和int i;for(i=0; i<n; i++){          // 以a[i]开头的所有子序列this_sum += a[i];           // 向右累加//if(this_sum > max_sum){max_sum = this_sum;}if(this_sum <0){            // 当前子序列和为负this_sum=0;             // 则不可能使向右累加的和增大,故抛弃}}return max_sum;
}

T(n)=O(n)T(n) = O(n)T(n)=O(n)

最大连续子序列和(4种算法)相关推荐

  1. 最长递增子序列的三种算法

    转载自:http://qiemengdao.iteye.com/blog/1660229 最长递增子序列 问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如 ...

  2. 分治算法-01连续子序列的最大和问题

    连续子序列的最大和 前言 分治算法的核心思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的. 首先通过"分" ...

  3. java实现子序列最大和_算法入门:最大子序列和的四种算法(Java)

    最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...

  4. 四种方法解决最大连续子序列和问题

    四种方法解决最大连续子序列和问题 参考文章: (1)四种方法解决最大连续子序列和问题 (2)https://www.cnblogs.com/AlvinZH/p/6795647.html 备忘一下.

  5. 操作系统:内存连续分配方式采用的几种算法及各自优劣

    连续分配方式(交换技术),是指为一个用户程序分配一个连续的内存空间.它主要包括单一连续分配.固定分区分配和动态分区分配. 注意:此处的连续内存分配是将整个进程的数据整块加载到内存之中. 1.单一连续分 ...

  6. C语言数组元素总和最大的连续子序列的算法(附完整源码)

    C语言数组元素总和最大的连续子序列的算法 C语言数组元素总和最大的连续子序列的算法完整源码(定义,实现,main函数测试) C语言数组元素总和最大的连续子序列的算法完整源码(定义,实现,main函数测 ...

  7. 算法--最大连续子序列和(动态规划,分而治之)

    今天在LeetCode上遇到一个求最大连续子序列和的问题,如下: Given an integer array nums, find the contiguous subarray (containi ...

  8. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /**************************************** copyright@hustyangju * blog: http://blog.csdn.n ...

  9. leetcode 659. 分割数组为连续子序列(贪心算法)

    给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 . 如果可以完成上述分割,则返回 true :否则,返回 f ...

  10. 54 - 算法 - 动态规划问题 连续子序列和最大

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cmath ...

最新文章

  1. 如何手动生成Dump文件并分析Dump文件
  2. 汉字的理据与造字取向
  3. N32-马哥Linux第一周学习
  4. 爆改100多元卡西欧,可测速、测温、测海拔,一点不输智能运动表
  5. CodeIgniter开发实际案例-新闻网站【转】
  6. python格式化输出的三种形式
  7. jsp页面模块的来源
  8. zabbix启动无效,无法监听10051
  9. (学习进度表)【第八周】
  10. 【洛谷 P4886】 快递员 (点分治)
  11. 编写hive udf函数
  12. 数据仓库与数据挖掘(二)
  13. c#json对象转数组_c# json 转数组
  14. 基于JTT808协议的车联网网关中间件
  15. windows 10 提升管理员权限
  16. 情有独钟,迷情电子三五年(七)
  17. 基于VUE的SVG动画处理(一)
  18. 饥荒联机版修改在线模式
  19. 弹性盒子布局(下面有代码)
  20. CSS 垂直对齐vertical-align属性

热门文章

  1. java volatile 和Transient 关键字
  2. libvirt API管理hypervisors
  3. 为什么谈设计总爱提老庄之道
  4. 基于java的心理健康网站的设计与实现_心理评测网站设计与实现(JSP,MySQL)(含录像)...
  5. 喇叭正反相位测试音频_音频功放失真的四大要点及改善方法
  6. 如何用python创建文件_终于明了python如何创建文件
  7. windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本
  8. SpringBoot学习---yaml配置
  9. mro python_一窥Python中MRO排序原理
  10. 计算机主页为什么打不开怎么办,主页被限制,打不开怎么办?