您的位置:首页 > 其它

杭电OJ 1003 最大子序列(分治法)Max Sum

2016-07-15 14:39 477 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003

需要注意的问题:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  杭电 1003 分治法