寻找A的和最大的非空连续子数组
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <math.h>
#include <climits>
using namespace std;
//17 100 113 110 85 105 102 86 63 81 101 94 106 101 79 94 90 97
void findCrossingSubArray(int *a, int low, int high, int &crossLow, int &crossHigh, int &crossSum){
int crossSumL = INT_MIN;
int sum = 0;
int mid = (low + high)/2;
for(int i = mid; i >= low; i--){
sum = sum + a[i];
if(sum > crossSumL){
crossSumL = sum;
crossLow = i;
}
}
int crossSumR = INT_MIN;
sum = 0;
for(int i = mid + 1; i <= high; i++){
sum = sum + a[i];
if(sum > crossSumR){
crossSumR = sum;
crossHigh = i;
}
}
crossSum = crossSumR + crossSumL;
}
void findMaxSubArrary(int *a, int low, int high, int &sum, int &lowL, int &highR){
if(low == high){
lowL = low;
highR = high;
sum = a[low];
}
else{
int mid = (low + high)/2;
int leftLow = 0;
int leftHigh = 0;
int leftSum = 0;
findMaxSubArrary(a, low, mid, leftSum, leftLow, leftHigh);
int rightLow = 0;
int rightHigh = 0;
int rightSum = 0;
findMaxSubArrary(a, mid + 1, high, rightSum, rightLow, rightHigh);
int crossLow = 0;
int crossHigh = 0;
int crossSum = 0;
findCrossingSubArray(a, low, high, crossLow, crossHigh, crossSum);
if(leftSum >= rightSum && leftSum >= crossSum){
lowL = leftLow,
highR = leftHigh;
sum = leftSum;
}
else if(rightSum >= leftSum && rightSum >= crossSum){
lowL = rightLow;
highR = rightHigh;
sum = rightSum;
}
else{
lowL = crossLow;
highR = crossHigh;
sum = crossSum;
}
}
}
int main(){
int num = 0;
scanf("%d", &num);
int *daysProfit = new int[num];
for(int i = 0; i < num; i++){
scanf("%d", &daysProfit[i]);
}
int low = 0;
int high = 0;
int sum = 0;
findMaxSubArrary(daysProfit, 0, days - 2, sum, low, high);
return 0;
}