分治法求最大子段和
2015-07-27 20:45
323 查看
前边介绍了动态规划法求最大子段和,这里用分治法来求。
分治法顾名思义,就是分而治之,化大为小,把一个大问题的解逐步分成小问题,最后再把小问题的解逐步合成大问题的解。
上代码简单易懂:
分治法顾名思义,就是分而治之,化大为小,把一个大问题的解逐步分成小问题,最后再把小问题的解逐步合成大问题的解。
上代码简单易懂:
#include <stdio.h> int max_sub_sum(int a[],int left, int right){ int center,i,j,sum,left_sum,right_sum,s1,s2,lefts,rights; if(left == right){ /*二分法递归结束条件*/ if(a[left] > 0) return a[left]; else return 0; }else{ center = (left + right)/2; left_sum = max_sub_sum(a, left,center); /*求左边最大子段*/ right_sum = max_sub_sum(a, center + 1, right);/*求右边最大子段*/ /*下面求中间交叉部分最大子段*/ s1 = 0; lefts = 0; for(i=center; i>=left;i--){ lefts = lefts + a[i]; if(lefts > s1){ s1 = lefts; } } s2 =0; rights = 0; for(j = center + 1; j<=right;j++){ rights = rights + a[j]; if(rights > s2){ s2 = rights; } } /*选择最大子段*/ if((s1 + s2 < left_sum) && (right_sum < left_sum))return left_sum; if(s1 + s2 < right_sum)return right_sum; return s1+s2; } } int main(){ int a[] = {-2,1,-4,13,-50,6}; int left_partion = -1; /*左边界*/ int right_partion = -1;/*右边界*/ int i =0; int ret = max_sub_sum(a,1,5); printf("max_sub_sum is:%d\n",ret); return 0; }
相关文章推荐
- hdoj 1873 看病要排队【优先队列】
- BZOJ3069 : [Pa2011]Hard Choice 艰难的选择
- List of Conquests
- XHTML基础
- php吧字符串直接转换成数组处理
- 制作映像(dmg)文件小教程
- Linux初级之总结一linux概述
- 每行最后一个li的样式独立设置
- springmvc mongodb 地理范围查询
- 内存泄露和内存溢出
- ListView的HeaderView
- String方法
- 【Leetcode】Sort List in O(nlogn) O(1)space
- [leetcode] Median of Two Sorted Arrays
- PAT-Advanced Level- 1002 两个多项式相加
- c++ primer 练习题 Exericise 2.3.3
- 深入解析之将100元兑换为1元、5元、10元的零钱,请问有多少种兑换方法
- 如何轻巧地配置Opencv(vs2010+opencv2.4.9)
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose)
- Exchange2013安装(新手必备)