博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求解最大子序列和的经典实现
阅读量:4111 次
发布时间:2019-05-25

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

                                                      求解最大子序列和

        记录下最大序列和的多个实现方法,时间复杂度由高至低,分别为ON3、ON2、ONlogN、ON。分别对应的是:直接穷举式、穷举改进式、分治处理、联机算法。好的算法实现,总给人以美的体验。

        下面直接贴代码:

#include 
int MaxSubsequenceSum1(const int *PArr,int n){ int ThisSum, MaxSum, i, j, k; MaxSum=0; for(i=0; i< n; i++) { for(j= i;j< n; j++) { ThisSum= 0; for(k= i;k<= j;k++) { ThisSum += PArr[k]; } if(ThisSum > MaxSum) { MaxSum= ThisSum; } } } return MaxSum; }int MaxSubsequenceSum2(const int *PArr,int n){ int ThisSum, MaxSum, i, j; MaxSum=0; for(i=0; i< n; i++) { ThisSum= 0; for(j= i;j< n; j++) { ThisSum += PArr[j]; if(ThisSum > MaxSum) { MaxSum= ThisSum; } } } return MaxSum;}int Max3(int a, int b, int c){ return (a >= b)?((a >= c)?(a):(c)):((b >= c)?(b):(c));}static int MaxSubSum(const int *PArr,int Left,int Right){ int MaxLeftSum, MaxRightSum; int MaxLeftBorderSum, MaxRightBorderSum; int LeftBorderSum, RightBorderSum; int Center, i; if(Left == Right) if(PArr[Left] > 0) return PArr[Left]; else return 0; Center= (Left + Right)/2; MaxLeftSum= MaxSubSum(PArr, Left, Center); MaxRightSum= MaxSubSum(PArr, Center+1, Right); MaxLeftBorderSum= 0; LeftBorderSum= 0; for(i = Center; i >= Left; i--) { LeftBorderSum += PArr[i]; if(LeftBorderSum > MaxLeftBorderSum) MaxLeftBorderSum= LeftBorderSum; } MaxRightBorderSum= 0; RightBorderSum= 0; for(i= Center + 1; i <= Right; i++) { RightBorderSum += PArr[i]; if(RightBorderSum > MaxRightBorderSum) MaxRightBorderSum= RightBorderSum; } return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);}int MaxSubsequenceSum3(const int *PArr,int n){ return MaxSubSum(PArr, 0, n-1);}int MaxSubsequenceSum4(const int *PArr,int n){ int ThisSum, MaxSum, j; ThisSum= MaxSum= 0; for(j= 0; j< n; j++) { ThisSum += PArr[j]; if(ThisSum > MaxSum) MaxSum= ThisSum; else if(ThisSum < 0) ThisSum= 0; } return MaxSum;}int main(void) { int testArr[10]= {1,3,5,7,-9,-5,4,8,10,0}; printf("%d\n",MaxSubsequenceSum1(testArr,10)); printf("%d\n",MaxSubsequenceSum2(testArr,10)); printf("%d\n",MaxSubsequenceSum3(testArr,10)); printf("%d\n",MaxSubsequenceSum4(testArr,10)); return 0;}

 

转载地址:http://pemsi.baihongyu.com/

你可能感兴趣的文章
快速排序<C#>
查看>>
UVALive 6322 最大匹配...
查看>>
jsp:jstl标签forTokens
查看>>
关于四则运算程序的测试
查看>>
Jsp 中登陆界面的实现方法
查看>>
ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
查看>>
php api接口校验规则示例
查看>>
Product Google的十大设计原则
查看>>
如何做html5山寨版愤怒的小鸟
查看>>
vue-cli3和ts建立vue项目
查看>>
设计模式
查看>>
php基础教程-输出Hello World
查看>>
RAID LVM ISCSI
查看>>
mysql报错
查看>>
html5 canvas路径绘制2
查看>>
HDU 2141 Can you find it?(二分)
查看>>
python中的数据结构
查看>>
第一天进入博客这个神奇的领域 在此%%%erosun
查看>>
新手对Spring的图解和一点个人理解
查看>>
Mac OS 10.6.5上如何默认启动mysq服务
查看>>