下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
经典算法——求最大子序列和比较经典的算法问题,能够很好的体现动态规划的实现,以一点“画龙点睛”大大精简了算法复杂度,且实现简单。本文中实现了4种:一般maxSubSequenceSumO0(n"3)简单优化过的算法maxSubSequenceSumlO(n"2)分治法优化的算法maxSubSequenceSum2O(n*log(n))动态规划的算法maxSubSequenceSum3O(n)#include<math.h>#include"mymath.h"/**计算序列的某段子序列的和,maxSubSequenceSumO使用*/staticintsubSequenceSum(inta[],intleft,intright){inti,sum=O;for(i=left;i<=right;i++){sum=sum+a[i];}returnsum;}/**三层遍历求子序列和的最大值,算法复杂度O(n"3)*/intmaxSubSequenceSumO(inta[],intlen){inti,j;intcurSum;/*当前序列和*/intmaxSum;/*最大序列和*//*初始化最大子序列和为序列第一个元素*/maxSum=a[O];/*第一层循环定义子序列起始位置*/for(i=0;i<len;i++){/*起始位置为i,初始化当前和为0*/curSum=0;/*第二层循环定义子序列结束位置*/for(j=i;j<len;j++){/*第三层循环在函数sumSubseqence中,计算子序列和*/curSum=subSequenceSum(a,i,j);/*与最大子序列和比较,更新最大子序列和*/if(curSum>maxSum){maxSum=curSum;}}}returnmaxSum;}/**双层遍历求子序列和的最大值,算法复杂度0(/2)*/intmaxSubSequenceSum1(inta[],intlen){inti,j;intcurSum;/*当前序列和*/intmaxSum;/*最大序列和*//*初始化最大子序列和为序列第一个元素*/maxSum=a[0];/*外层循环定义子序列起始位置*/for(i=0;i<len;i++){/*起始位置为i,初始化当前和为0*/curSum=0;/*内层循环定义子序列结束位置*/for(j=i;j<len;j++){/*计算子序列和,并与最大子序列和比较,更新最大子序列和*/curSum=curSum+a[j];/*与最大子序列和比较,更新最大子序列和*/if(curSum>maxSum){maxSum=curSum;}}}returnmaxSum;}/**某段字序列中,含左边界元素的字序列和中的最大值,_maxSubSequenceSum2中使用*/staticint_maxLeftBoderSubSequenceSum(inta[],intleft,intright){inti;intsum=0;intmaxSum=a[left];for(i=left;i<=right;i++){sum+=a[i];if(sum>maxSum){maxSum=sum;}}returnmaxSum;}/**某段字序列中,含右边界元素的字序列和中的最大值,_maxSubSequenceSum2中使用*/staticint_maxRightBoderSubSequenceSum(inta[],intleft,intright){inti;intsum=0;intmaxSum=a[right];for(i=right;i>=left;i--)sum+=a[i];if(sum>maxSum){maxSum=sum;}}returnmaxSum;}/**求序列某段子序列中子序列和最大值*/staticint_maxSubSequenceSum2(inta[],intleft,intright){intcenter;intleftMaxSum;intrightMaxSum;intmaxLeftBorderSum;intmaxRightBorderSum;/*递归终止条件*/if(left==right){returna[left];}/*分治法递归开始,取中点二分处理*/center=(left+right)>>1;/*center=(left+right)/2;*//*递归求左右子序列段中最大子序列和*/leftMaxSum=_maxSubSequenceSum2(a,left,center);rightMaxSum=_maxSubSequenceSum2(a,center+1,right);maxLeftBorderSum=_maxRightBoderSubSequenceSum(a,left,center);maxRightBorderSum=_maxLeftBoderSubSequenceSum(a,center+1,right);/**二分后的最大值有三个:*1、leftMaxSum,左段最大子序列和*2、rightMaxSum,右段最大子序列和*3、maxLeftBorderSum+maxRightBorderSum,左段最大含右边界子序列和最大值和右段最大含左边界子序列和最大值,二者之和*这三者中的最大值即为分段前的最大子序列和**分治算法核心部分,解决分治后结果归并问题,具体分析:*这是对分段后的子序列的一种划分,有三种,只需分别求出各种的最大值然后在三者之间取一个最大值即可:*1、子序列全在左段,最大子序列和为leftMaxSum*2、子序列全在右段,最大子序列和为rightMaxSum*3、子序列跨左右段,最大字序列和为maxLeftBorderSum+maxRightBorderSum*/returntmax(leftMaxSum,rightMaxSum,maxLeftBorderSum+maxRightBorderSum);}/**分治法实现,算法复杂度O(n*log(n))*分:使用二分法进行分段*治:详细算法见_maxSubSequenceSum2内描述,简述为:*全段最大子序列为以下三者中的最大值*左段最大子序列和*右段最大子序列和*左段最大含右边界子序列和最大值和右段最大含左边界子序列和最大值之和*/intmaxSubSequenceSum2(inta[],intlen){return_maxSubSequenceSum2(a,0,len-1);}/**动态规划实现,算法复杂度O(n)*/intmaxSubSequenceSum3(inta[],intlen){inti;intcurSum;/*当前序列和*/intmaxSum;/*最大序列和*//*初始化当前序列和为0*/curSum=0;/*初始化最大子序列和为序列第一个元素*/maxSum=a[0];/*开始循环求子序列和*/fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 废旧安全网处理协议书
- 预防性抗生素使用指南
- 口腔科牙周炎患者洁牙护理培训指南
- 2026河南黄金叶投资管理有限公司所属企业大学生招聘29人备考题库(第一批次)附参考答案详解(基础题)
- 2026广西北海市银海区银滩镇人民政府招录公益性岗位1人备考题库及答案详解【全优】
- 2026江苏扬州大学招聘教学科研和医务人员214人备考题库(第一批)附答案详解【完整版】
- 2026宁波甬科天使创业投资基金管理有限公司招聘1人备考题库带答案详解(新)
- 2026广东深圳理工附中教师招聘9人备考题库含答案详解(培优a卷)
- 2026青海西宁正华建设投资控股有限公司招聘2人备考题库附答案详解(a卷)
- 2026年4月广西梧州市苍梧县城镇公益性岗位人员招聘2人备考题库带答案详解(a卷)
- 电力专业数据传输(EPDT)通信系统-总体技术规范
- 2024仁爱版初中英语单词表(七-九年级)中考复习必背
- 生化池清掏方案
- 史上最全船舶演习记录规范(中英文对照)
- 劳动力、机械设备和材料投入计划措施
- 陶瓷装饰工(四级)理论考试复习题库(浓缩300题)
- 冠心病规范化诊断和治疗
- 2022届北京海淀高三语文一模评标说明课件
- 水利工程建设标准强制性条文工程地质勘察部分宣贯
- 燃气用户检修工
- 车辆信息登记表参考模板范本
评论
0/150
提交评论