#include<iostream>
using namespace std;
int maxSum(int a[],int left,int right){
//数组 左边位置 右边位置
int sum=0;
//如果长度为1 也就是左右相等
if(left==right){
if(a[left]>a[right])
sum=a[left];
else
sum=a[right];
}
else{
//长度大于1 进入判断
int center=(left+right)/2; //找到中间位置
int leftSum=maxSum(a,left,center); //递归求左边
int rightSum=maxSum(a,center+1,right);//递归求右边
//不能递归处理,最大子段和横跨两个子序列
//左边的中间部分
int s1=0;
int lefts=0;
for(int i=center;i>=left;i--){
lefts+=a[i];
if(lefts>s1)
s1=lefts;
}
//右边的中间部分
int s2=0;
int rights=0;
for(int i=center+1;i<right;i++){
rights+=a[i];
if(rights>s2)
rights=s2;
}
sum=s1+s2; //最大子段和是左边最大+右边最大
if(sum<leftSum) //最大值比右侧递归小
sum=leftSum;
if(sum<rightSum) //最大值比左侧递归小
sum=rightSum;
}
return sum;
}
int main(){
int a[]={-2,11,-4,13,-5,-2};
int n=6;
for(int i=0;i<6;i++){
cout<<a[i]<<" ";
}
cout<<"最大子段和为:"<<maxSum(a,1,6);
}