输入一个数组,输出最大连续子数组区间,以及最大连续子数组和的值
#include <iostream>
#include <limits>
using namespace std;
const int MIN=1<<(sizeof(int)*8-1); // int MIN=numeric_limits<int>::min();
const int MAX=-(1<<(sizeof(int)*8-1)+1); // int MAX=numeric_limits<int>::max();
struct MAX_ARRAY{
int left;
int right;
int sum;
}LEFT,RIGHT,MIDDLE;
MAX_ARRAY FIND_MAX_CROSSING_SUBARRAY(int a[],int left,int mid,int right)
{
int left_sum=MIN,right_sum=MIN;
int sum=0;
int max_left=-1,max_right=-1;
for(int i=mid;i>=left;i--)
{
sum+=a[i];
if(left_sum<=sum)
{
left_sum=sum;
max_left=i;
}
}
sum=0;
for(int i=mid+1;i<=right;i++)
{
sum+=a[i];
if(right_sum<=sum)
{
right_sum=sum;
max_right=i;
}
}
MIDDLE.left=max_left;
MIDDLE.right=max_right;
MIDDLE.sum=left_sum+right_sum;
return MIDDLE;
}
MAX_ARRAY FIND_MAX_SUBARAY(int a[],int left,int right)
{
if(left==right)
{
LEFT.left=left;
LEFT.right=right;
LEFT.sum=a[left];
return LEFT;
}
else
{
int mid=(left+right)/2;
LEFT=FIND_MAX_SUBARAY(a,left,mid);
RIGHT=FIND_MAX_SUBARAY(a,mid+1,right);
MIDDLE=FIND_MAX_CROSSING_SUBARRAY(a,left,mid,right);
if(LEFT.sum > RIGHT.sum && LEFT.sum > MIDDLE.sum) return LEFT;
else if(RIGHT.sum > LEFT.sum && RIGHT.sum > MIDDLE.sum) return RIGHT;
else return MIDDLE;
}
}
int main(int argc, char *argv[])
{
// int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++) cin>>a[i];
MAX_ARRAY test;
test=FIND_MAX_SUBARAY(a,0,n-1);
cout<<test.left<<" "<<test.right<<" "<<test.sum<<endl;
return 0;
}