[分治递归]解决最大子序列和问题

简介:

Pnig0s1992 p.s:比较直白简单的嵌套for循环顺序累加判断的方式就不介绍了,比较容易实现,而且时间复杂度O(N^3) or O(N^2)比较坑爹。这里用分治递归的方法去解决O(NlogN),当然还有动态规划的方法O(N)以后再说。

先简单总结下分治递归的基本过程:

    1,传入待处理的序列集合,及初始下标(iLeft)和终点下标(iRight=N-1,N为元素个数)

    2,处理小容量问题 e.g:if(iLeft == iRight){....}

    3,将数据从中间分成两部分并将前后两部分依次递归调用。

    4,处理每个子段的过程。

核心部分注释的比较详细了,纯算法练习,高手飘过。

 

 
  1. //Code By Pnig0s1992  
  2. //Date:2012,3,12  
  3. #include <stdio.h>  
  4. #include <Windows.h>  
  5. #include <stdlib.h>  
  6.  
  7. #define N 8  
  8.  
  9. int CallSubsequenceSum(int s[],int iLength);  
  10. int SubsequenceSum(int s[],int iLeft,int iRight);  
  11. int Maxinthree(int a,int b,int c);  
  12.  
  13. int main(int argc,CHAR * argv[])  
  14. {  
  15.     int myList[N] = {4,-3,5,-2,-1,2,6,-2};  
  16.     int myResult;  
  17.     for(int i=0;i<N;i++)  
  18.     {  
  19.         printf("%d ",myList[i]);  
  20.     }  
  21.     myResult = CallSubsequenceSum(myList,N-1);  
  22.     printf("\n最大子序列和为:%d",myResult);  
  23.     system("pause");  
  24. }  
  25.  
  26. int CallSubsequenceSum(int s[],int iLength)  
  27. {  
  28.      return SubsequenceSum(s,0,iLength);  
  29. }  
  30.  
  31. int SubsequenceSum(int s[],int iLeft,int iRight)  
  32. {  
  33.     int iMaxLeftSum,iMaxRightSum; //表示  
  34.     int iRightBorderSum = 0,iLeftBorderSum = 0;  
  35.     int iMaxLeftBorderSum = 0,iMaxRightBorderSum = 0;  
  36.     int iCenter;  
  37.     if(iLeft == iRight) //解决小容量情况,当序列只有一个元素时,非负则返回唯一值,否则返回0(基准情况)  
  38.     {  
  39.         if(s[iLeft]>0)  
  40.         {  
  41.             return s[iLeft];  
  42.         }else 
  43.         {  
  44.             return 0;  
  45.         }  
  46.     }  
  47.     iCenter = (iLeft+iRight)/2;  
  48.     iMaxLeftSum = SubsequenceSum(s,iLeft,iCenter); //每次递归返回时,该值为该子段的最终左最大子序列和  
  49.     iMaxRightSum = SubsequenceSum(s,iCenter+1,iRight); //每次递归返回时,该值为该子段的右最大自序列和  
  50.     for(int i=iCenter;i>=iLeft;i--) //从中间向左扩展求子段的最大子序列和,必然包括子段的最右端数  
  51.     {  
  52.         iLeftBorderSum+=s[i];  
  53.         if(iLeftBorderSum>iMaxLeftBorderSum)  
  54.         {  
  55.             iMaxLeftBorderSum = iLeftBorderSum; //包含左端数的最大子序列和  
  56.         }  
  57.     }  
  58.     for(int j=iCenter+1;j<=iRight;j++) //从中间向右扩展求子段的最大子序列和,必然包括子段的最左端数  
  59.     {  
  60.         iRightBorderSum += s[j];  
  61.         if(iRightBorderSum > iMaxRightBorderSum)  
  62.         {  
  63.             iMaxRightBorderSum = iRightBorderSum; //包含右端数的最大子序列和  
  64.         }  
  65.     }  
  66.     //返回左子最大序列和,右最大子序列,及横跨中间的最大子序列和三者的最大值  
  67.     return Maxinthree(iMaxLeftSum,iMaxRightSum,iMaxLeftBorderSum+iMaxRightBorderSum);   
  68. }  
  69.  
  70. int Maxinthree(int a,int b,int c)  
  71. {  
  72.     if(b>a)  
  73.         a=b;  
  74.     if(a<c)  
  75.         return c;  
  76.     else 
  77.         return a;  

 









本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/803907,如需转载请自行联系原作者

相关文章
|
C++
C++ 条件与 If 语句:掌握逻辑判断与流程控制精髓
C++ 中的条件语句用于根据布尔表达式的真假执行不同代码。`if` 用于当条件为真时执行一段代码,`else` 配合 `if` 在条件不成立时执行另一段代码。`else if` 允许测试额外的条件。`switch` 语句提供多分支选择。还有三元运算符 `(condition) ? expressionTrue : expressionFalse`,它是一种简写的 if...else 形式,常用于一行内作出决定。
333 0
uniApp常用功能封装
uniApp常用功能封装
182 0
|
Java 数据库连接 mybatis
mybatis异常 :元素内容必须由格式正确的字符数据或标记组成。
今天同事写一个查询接口的时候,出错:元素内容必须由格式正确的字符数据或标记组成。   错误原因:mybatis查询的时候,需要用到运算符 小于号:< 和  大于号: >,在mybatis配置文件里面,这种会被认为是标签,所以解析错误 错误事例: select from t...
2035 0
|
10月前
|
数据采集 Java Linux
面试大神教你:如何巧妙回答线程优先级这个经典考题?
大家好,我是小米。本文通过故事讲解Java面试中常见的线程优先级问题。小明和小华的故事帮助理解线程优先级:高优先级线程更可能被调度执行,但并非越高越好。实际开发需权衡业务需求,合理设置优先级。掌握线程优先级不仅能写出高效代码,还能在面试中脱颖而出。最后,小张因深入分析成功拿下Offer。希望这篇文章能助你在面试中游刃有余!
193 4
面试大神教你:如何巧妙回答线程优先级这个经典考题?
|
12月前
|
人工智能 自然语言处理 云计算
谁主沉浮:解析中国CRM市场的竞争格局 谁是中国CRM里的第一
在中国企业数字化转型的大潮中,CRM市场日益竞争激烈。销售易凭借深厚的技术积累、自主研发的PaaS平台及AI技术的应用,以及对中国企业需求的深刻理解,在技术创新、产品体系、行业经验和本土化能力等方面展现出显著优势,确立了其在CRM市场的领导地位。面对纷享销客、金蝶云之家、明源云等竞争对手,销售易通过持续的技术创新和产品升级,不断巩固并扩大其市场优势。
谁主沉浮:解析中国CRM市场的竞争格局 谁是中国CRM里的第一
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
1119 0
|
传感器
水传感器的技术原理有哪些
水传感器通过多种技术原理检测水质,包括电导率测量、光学感应、化学反应和生物传感等方法,可监测pH值、溶解氧、浊度等参数。
|
人工智能 自然语言处理 搜索推荐
通义灵码:AI辅助开发工具的新范式
在大模型时代,阿里云的通义灵码作为AI辅助开发工具,通过提高开发效率、简化协作和降低成本,重塑了软件开发的核心要素。通义灵码基于大模型和自然语言处理技术,实时辅助代码编写、调试和优化,提供个性化支持,显著提升了开发体验。未来,AI将在软件开发中发挥更大作用,通义灵码将继续引领这一变革。
424 0
通义灵码:AI辅助开发工具的新范式
|
存储 5G API
来了,永久免费的图床服务
Markdown爱好者推荐PicGo软件搭配免费图床服务SMMS,解决在Markdown中插入图片的困扰。PicGo支持多种图床,如腾讯云、阿里云和免费的SMMS,提供拖拽上传、压缩图片功能。通过VSCode或Typora配合PicGo插件,能实现图片自动上传并转换为Markdown格式。SMMS提供5GB免费存储,足够个人博客使用。

热门文章

最新文章