杭电OJ 1003 最大子序列(分治法)Max Sum
2016-07-15 14:39
477 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003
需要注意的问题:
1、需要设置最小值,题目中说序列中的值在-1000到1000之间,因此在设置初始值时不能使用0
2、为了获取第一个最大自序列,解的优先级左侧>过中点>右侧
需要注意的问题:
1、需要设置最小值,题目中说序列中的值在-1000到1000之间,因此在设置初始值时不能使用0
2、为了获取第一个最大自序列,解的优先级左侧>过中点>右侧
#include<stdio.h> #define MAX_SIZE 100000 #define MIN - 10000 int a[MAX_SIZE]; int findMaxSubArray(int a[], int s, int e, int &lPoint, int &rPoint){ if(s == e){ lPoint = s; rPoint = e; return a[s - 1]; } int r = (s + e) / 2; int max; int llPoint; int lrPoint; int lMax = findMaxSubArray(a, s, r, llPoint, lrPoint ); int rlPoint; int rrPoint; int rMax = findMaxSubArray(a, r + 1, e, rlPoint, rrPoint ); int midMax = MIN; int mlPoint = r; int mrPoint = r; int sum = 0; int i; for(i = r - 1; i >= s - 1; i -- ){ sum += a[i]; if(midMax <= sum){ midMax = sum; mlPoint = i + 1; } } for(i = r, sum = midMax; i < e; i ++){ sum += a[i]; if(midMax <= sum){ midMax = sum; mrPoint = i + 1; } } if(lMax >= midMax && lMax>=rMax){ max = lMax; lPoint = llPoint; rPoint = lrPoint; return max; } if(midMax > lMax && midMax >= rMax){ max = midMax; lPoint = mlPoint; rPoint = mrPoint; return max; } if(rMax > midMax && rMax> lMax){ max = rMax; lPoint = rlPoint; rPoint = rrPoint; return max; } } int main(){ int t; while(scanf("%d", &t) != -1){ int i; for(i = 0; i < t; i ++){ int n, j; int lPoint, rPoint; scanf("%d", &n); for(j = 0; j < n; j ++){ scanf("%d", a + j); } int max = findMaxSubArray(a, 1, n, lPoint, rPoint); if(i != 0){ printf("\n"); } printf("Case %d:\n", i + 1); printf("%d %d %d\n", max, lPoint, rPoint); } } return 0; }
相关文章推荐
- 算法详解之分治法具体实现
- python使用分治法实现求解最大值的方法
- 分分钟掌握快速排序(Java / Scala 实现)
- 高精度加法——杭电1002
- Hdu2066(一个人的旅行)
- 公式加括号的所有可能
- 杭电1870 愚人节的礼物
- 关于杭电1405 The Last Practice 的问题
- hdu-1103 模拟题。
- hdu-1022 栈的应用。
- hdu-1247 简单map的应用。(字典树)
- hdu-1251 字典树公共前缀。
- hdu-1075 map映射表的应用。
- 杭电ACM Steps (1)
- hdu 1005 -- Number Sequence
- hdu 1007 -- Quoit Design
- 杭电1004
- 杭电1005
- 杭电1008
- 贪心 hdu 1003