博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[分治递归]解决最大子序列和问题
阅读量:6334 次
发布时间:2019-06-22

本文共 2002 字,大约阅读时间需要 6 分钟。

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,如需转载请自行联系原作者

你可能感兴趣的文章
泛型排序器TComparer
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
查看>>
Adobe驳斥Flash过度耗电论 称HTML5更耗电
查看>>
No!No!No! It's not fashion!
查看>>
艰困之道中学到的经验教训
查看>>
互联网生态建设落地五大挑战——保险科技生态建设 ...
查看>>
进行短视频app开发工作时,可以加入它来保护青少年 ...
查看>>
25G DAC无源高速线缆和25G光模块之间的区别
查看>>
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>
百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立 ...
查看>>
10 个 Linux 中方便的 Bash 别名
查看>>
[Server] 服务器配置SSH登录邮件通知
查看>>
全新 DOCKER PALS 计划上线,带给您不一样的参会体验! ...
查看>>
Android开发之自定义View(二)
查看>>
python爬虫之微打赏(scrapy版)
查看>>
自制操作系统Antz day08——实现内核 (中) 扩展内核
查看>>