最大子列问题几种方法
2016-02-29 15:14
323 查看
int MaxSubseqSum1(int List[], int N) { int ThisSum,MaxSum = 0; for (int i = 0; i < N; i++) { for (int j = i; j < N; j++) { ThisSum = 0; for (int k = i; k <=j; k++) ThisSum += List[k]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; } int MaxSubseqSum2(int List[], int N) { int ThisSum,MaxSum = 0; for (int i = 0; i < N; i++) { ThisSum = 0; for (int j = i; j < N; j++) { ThisSum += List[j]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; } //在线处理 int MaxSubseqSum3(int List[], int N) { int ThisSum = 0; int MaxSum = 0; for (int i = 0; i < N; i++) { ThisSum += List[i];//向右累加 if (ThisSum > MaxSum) MaxSum = ThisSum;//发现更大的则更新当前的结果 else if (ThisSum < 0)//如果当前的子列和为负,则不可能使后面的部分和增大,抛弃之 ThisSum = 0; } return MaxSum; } //分而治之 int Max3(int A, int B, int C) { int Max = A; if (Max < B) Max = B; if (Max < C) Max = C; return Max; } int DivideAndConquer(int List[], int left, int right) { if (left == right)//递归终止的条件,子列只有一个数字 { if (List[left] > 0) return List[left]; return 0; } int center = (left + right)/2;//找到中分的点 //递归求得两边子列的最大和 int MaxLeftSum = DivideAndConquer(List, left, center); int MaxRightSum = DivideAndConquer(List, center+1, right); //下面求跨分解线的最大子列和 int MaxLeftBorderSum = 0; int LeftBorderSum = 0; for (int i = center; i >= left; i--) { LeftBorderSum += List[i]; if (LeftBorderSum > MaxLeftBorderSum) MaxLeftBorderSum = LeftBorderSum; }//左边扫描结束 int MaxRightBorderSum = 0; int RightBorderSum = 0; for (int i = center + 1; i <= right; i++) { RightBorderSum += List[i]; if (RightBorderSum > MaxRightBorderSum) MaxRightBorderSum = RightBorderSum; }//右边扫描结束 return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum); } int MaxSubseqSum4(int List[], int N) { return DivideAndConquer(List, 0, N-1); }
相关文章推荐
- The Day You Went Away
- Syslog协议介绍
- IOS开发 拍照上传图片旋转90°
- DNS设置
- 第六天
- 第五天
- Qt5_当前exe所在路径
- H5单页面架构:backbone + requirejs + zepto + underscore
- MySQL分库分表单库分表和迁移数据(4th)
- 第十八课:公告板与粒子2
- java学习笔记-抽象类abstract与接口interface
- 从HTTP GET和POST的区别说起(面试心得)
- Struts,Hibernate,spring工作机制
- IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)
- JSP之request对象
- H5单页面架构:requirejs + angular + angular-route
- 详解Android中App的启动界面Splash的编写方法
- 如何使用robots.txt及其详解
- 纯CSS3属性animation实现的打字效果
- java server