最大子数组
#define INF 65535
int maxleft, maxright; // 最大子数组左右边界
int max_cross_subarray(int *imput, int left, int mid, int right)
{
int sum, i;
int maxleftsum = -INF, maxrightsum = -INF;
for(i = mid, sum = 0; i >= left; i--) {
sum += imput[i];
if(sum > maxleftsum) {
maxleftsum = sum;
maxleft = i;
}
}
for(i = mid+1, sum = 0; i <= right; i++) {
sum += imput[i];
if(sum > maxrightsum) {
maxrightsum = sum;
maxright = i;
}
}
return maxleftsum + maxrightsum;
}
int max_subarray(int *imput, int left, int right)
{ /* 返回最大子数组之和 */
int mid, leftsum, midsum, rightsum;
int maxlowleft, maxlowright, maxhighleft, maxhighright, maxmidleft, maxmidright;
if(left == right) {
maxleft = left;
maxright = right;
return imput[left];
} else {
mid = (left + right) / 2;
leftsum = max_subarray(imput, left, mid);
maxlowleft = maxleft;
maxlowright = maxright;
rightsum = max_subarray(imput, mid+1, right);
maxhighleft = maxleft;
maxhighright = maxright;
midsum = max_cross_subarray(imput, left, mid, right);
maxmidleft = maxleft;
maxmidright = maxright;
if(leftsum >= rightsum && leftsum >= midsum) {
maxleft = maxlowleft;
maxright = maxlowright;
return leftsum;
} else if(rightsum >= leftsum && rightsum >= midsum) {
maxleft = maxhighleft;
maxright = maxhighright;
return rightsum;
} else {
maxleft = maxmidleft;
maxright = maxmidright;
return midsum;
}
}
}