最大子序列和

一、遍历所有可能情况

(1234...N)所有可能子序列如下:

1;12;123......

2;23;234......

......

N

共N趟,没趟可能的情况由N,N-1...,1依次递减。

时间复杂度O(N3)的算法:

int MaxSubsequenceSum( const int A[ ] , int N)

{

int MaxSum = 0;

for(int i = 0; i < N; i++)  //控制趟数为N

//每趟可能的子序列和有以下两个循环控制。

  for(int j = i; j < N; j++)  //控制每趟的开始位置

  {

    int sum = 0;

    for(int k = j; k < N; k++)

    {

      sum += A[k];

      if(sum > MaxSum)

      MaxSum = sum;

    }

  }

  return MaxSum;

}

二、时间复杂度O(N2)

不考虑程序跑的趟数,直接罗列所有情况

int MaxSum = 0;

for(i = 0; i < N; i++)

{

  sum = 0;

  for(j = i; j < N; j++)

  {  

    sum += A[j];   

    if(MaxSum < sum)

    MaxSum = sum;

  }

return MaxSum;

}

三、相对复杂度O(N*logN)递归算法

分而治之:将问题分解为两个大小大致相等的子问题——分;两个子问题的解合并到一起并再做些少量附加工作,最后得到整个问题的解——治。

最大子序列可能出现的位置为数据的左半边,数据的右半边,数据的中部。

从概率论的角度来解读就是找出事件的完备事件组,将情况分为两类:1、包含中间元素;2、不含中间元素。其中不含中间元素又分左右侧两种情况。

int MaxSubsequenceSum( const int A[ ], int N)

{

  return MaxSubSum(A, 0, N-1);   //增加边界的参数

}

static int MaxSubSum( const int A[ ], left, right)

{

  if(left == right)

    if(A[left] > 0)

    return A[left];

    else return 0;

  int center = (left + right)/2;

  int MaxLeftSum = MaxSubSum(A, left, center);

  int MaxRightSum = MaxSubSum(A, left, center);

int maxLeftSum = 0;  

for(int i = center; i >= left; i--)

  {

    int leftSum += A[i];

      if(maxLeftSum < leftSum)

    maxLeftSum = leftSum;

  }

int maxRight = 0;

  for(int j = center; j <=right; j--)

  {

    int rigthSum += A[j];

    if(maxRightSum < rightSum )

    maxRightSum = rightSum;

  }

return Max3(MaxLeftSum, MaxRightSum, maxRightSum+maxLeftSum);

}

int Max3(a,b,c)

{

  return a > (b>c?b:c)?a:(b>c?b:c);

}

四、时间复杂度O(N)

1、如果sum<0,将sum置0,maxSum不更新,即maxSum从序列中首正数开始记录;

2、将求和的几个元素看做一个单元组,包含首正数的单元组中出现大于首正数时,更新maxSum,即maxSum=sum,此时maxSum存放当前最大子序列和;

3、当有负数出现时,sum<maxSum,maxSum不更新。当sum<0时,该单元组整体为一个负数,其后每个单元组包含该单元组都是负增长,故将sum置0,maxSum不更新;

int MaxSubsequenceSum( const int A[], int N)

{

  int sum = 0; int maxSum = 0;

  for(int i = 0 ; i < N; i++)

  {

    sum += A[i];

    if(maxSum < sum)

     maxSum = sum;

    else if(sum < 0)

      sum = 0;

  }

return maxSum;

}

转载于:https://www.cnblogs.com/Lunais/p/5140478.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

!--注释--和%--注释--%有什么区别

转载&#xff1a;版权所有&#xff1a;基础软件。作者邮箱&#xff1a;s.j.l.studiohotmail.com&#xff0c;sun.j.l.studiogmail.com。本文首发于 http://www.cnblogs.com/FoundationSoft。文章转载请保持此版权信息并注明出处。 使用ASP.NET编辑页面时&#xff0c;有两种注释…

团队开发——用户需求调研报告

用户需求调研报告 项目名称&#xff1a; 躲避小球 项目编号&#xff1a;001 调研主题&#xff1a; 用户需求 访谈时间&#xff1a;2015.4.10 调研地点&#xff1a; 石家庄铁道大学图书馆 访谈部门&#xff1a; 三个人行 参与人员&#xff1a; 林彦汝 1. 访谈目的 1、让用…

8086地址传送指令LDS,LES

LDS REG,OPRE;REG是一个16位寄存器,OPRD是一个存储器操作数,为双字项,高16位送入DS,低16位送入REG LDS BX,[SI](ds:si取得存储器中32位(双字),高16位作为段值送入DS中,低十六位送入指定的BX寄存器中)data segmentidata dd 12345678H data ends code segment assume cs:code,ds:…

设计模式(十五):解释器模式

一、定义 在设定环境中&#xff0c;定义一种规则或者语法&#xff0c;通过解释器来解释规则或者语法的含义. 二、实例&#xff1a;将 二十一 —> 21 2.1 设定我们的环境 Context public class Context{public string Input { get; set; }public int Output { get; se…

8086地址传送指令LEA,LDS,LES

LEA BX,[SI] ;BX<--DS:[SI]内存单元的偏移地址,与该单元中的数据无关 LDS BX,[SI] ;BX<--DS:[si]内存单元中的数据的低16位,DS<--内存单元中数据的高16位 LES BX,[SI] ;BX<--DS:[SI] ,ES<--DS:[SI2] 显然LDS和LES的操作数是32位的(两个字 四个字节 32位) 写个…

MySQL 5.7.10 免安装配置

# 配置环境&#xff1a;windows 64bit # 安装版本&#xff1a;mysql-5.7.10-win32&#xff08;zip archive版本&#xff09; 1. ZIP Archive版是免安装的&#xff0c;只需把mysql-5.7.10-win32.zip解压到安装目录即可。 2. 在D:\Program Files\mysql-5.7.10-win32文件夹下新建配…

Cacti安装教程

CentOS 6.0架设流量监控及集中日志系统第一章、cacti的安装1、 系统的基本设置2、 设置主机名3、 [rootlocalhost ~]# vi /etc/sysconfig/network4、 [rootlocalhost ~]# exit5、 重新登陆6、 [rootGZ-Cacti ~]#7、 安装screen后台运行程序yum -y install screen8、 安装优秀的…

8086条件转移指令JE,JZ

JZ/JE 指令格式 转移条件 说明 JZ/JE 标号 ZF1 等于0或相等转移code segment assume cs:codemov ax,2mov bx,2cmp ax,bxje ok ;如果axbx 进行转移(其实是检测ZF的值进行转移操作);根据ZF1 得出axbx ,所以才有axbx 相等则转移 iout: mov ax,4c00Hint 21H ok: add a…

单片机C语言下LCD多级菜单的一种实现方法

摘要: 介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑、实用的程序模型。 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD  中图分类号:TP311. 1    文献标识码:B 收稿日期:2005 - 11 - 210  引言 由于C 语…

fortran语法笔记

1&#xff0c;数据类型&#xff0c;fortran支持整形&#xff0c;real型&#xff0c;logical型&#xff0c;char型&#xff0c;复数型。整形分为为长整形和短整形定义长整形的方法 同时声明多个变量的话可以用逗号隔开。 加两个冒号的话可以直接在声明的时候赋值。 fortran是唯一…

8086条件转移指令JNE,JNZ

JNZ/JNE 指令格式 转移条件 说明 JNZ/JNE 标号 ZF0 不等于0或不相等转移code segment assume cs:codemov ax,5mov bx,2cmp ax,bx ;两数比较 不相等则转移 jne ok iout: mov ax,4c00Hint 21H ok: add ax,bxjmp iout code ends endAX0005 BX0002 CX0013 DX0000 SP00…

8086条件转移指令JE/JZ,JNE/JNZ

JE/JZ,JNE,JNZ检测的只是ZF的值,只要ZF满足则进行转移 JE的逻辑含义是相等则转移 但是JE进行操作的是ZF1才执行所有相等则转移是通过CMP指令来配合使用体现出的CMP AX,BX ;ax-bx 结果是否为0 {true ,ZF1} {false ,ZF0} JE OK (ZF1说明两数相等) (ZF…

git 使用手册

git 作为开源项目首选版本管理软件&#xff0c;必然其优势不容小觑&#xff0c;下面总结一下初次解除用到的一些技能 1. 基本命令介绍 git help branch 查看branch帮助文档 git branch -a 列出当前所有分支 git branch good_proj 创建分支good_proj git checkout good_p…

WZY社区

WZY社区是我自己做的一个网站&#xff0c;后面会详细更新&#xff0c;敬请关注&#xff01;转载于:https://www.cnblogs.com/jxldjsn/p/5146682.html

条件转移指令和无条件转移指令练习

无条件转移指令 JMP条件转移指令 JE JNE JB 低于转移(小于) JNB 不低于转移(大于等于) JA 高于转移(大于) JNA不高于转移(小于等于)查找出数据中0&#xff5e;9的无符号数写到itable单元中 0&#xff5e;9 大于等于0 小于等于9 用JNB和JNA最合适不过了 贴代码~assume cs:code,d…

UISearchBar控件

搜索&#xff0c;无疑可以使用UISearchBar控件&#xff01; 那就先了解一下UISearchBar控件吧&#xff01; UISearchBar控件就是要为你完成搜索功能的一个专用控件。它集成了很多你意想不到的功能和特点&#xff01; 首先&#xff0c;还是来普及一下UISearchBar控件API相关的属…

BSA基础数据维护

平台 BSA基础数据维护 。扇区五个字段的内容 本来值为0&#xff0c;经过107上计算解析&#xff0c;得出正常的数值。然后106上报&#xff08;200050&#xff09;&#xff0c;得到回复&#xff08;200051&#xff09;。 查看回复数据&#xff0c;是否有错误。比如提示104 基站拼…

事务 mysql redis

mysql 事务 start transaction; update ... insert ... create table的不行 rollback;//回滚 commit;//提交 redis 事务 multi incrby age 1 //age1 decrby age 2 //age-2 discard //取消执行 (discard 丢弃) exec //执行 ----------------------- watch keyName1 keyName2 ke…

继续说invoke伪指令

.data ;数据段 titleS db helloworld,0 messageS db hello,welcome to win32,0.code ;代码段 start: invoke MessageBox,NULL,offset messageS,offset titleS,MB_OK invoke ExitProcess,NULL end startMASM编译下边invoke 会把参数从右向左入栈并调用CALLinvoke MessageBox,NU…

织梦CMS AJAX分页,可自定义typeid,调取任意内容

第一步&#xff1a; 把下面这段代码放在html的 head之间 <script language"javascript" type"text/javascript" src"{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script> <script language"javascript"> &…