#include <iostream>
using namespace std;
struct subarray{
int low;
int high;
int data;
};
subarray FIND_CROSSING_SUBARRAY(int *A,int low,int middle,int high);
subarray FIND_MAXINUM_SUBARRAY(int *A,int low,int high);
int main()
{
int num;
int *data;
cout<<"请输入你想要求解数组的长度:"<<endl;
cin>>num;
cout<<"请依次输入你的数组:"<<endl;
data=new int(num);
for(int i=0;i<num;i++){
cin>>data[i];
}
subarray conclusion;
conclusion=FIND_MAXINUM_SUBARRAY(data,0,num-1);
cout<<conclusion.data<<" "<<conclusion.low<<" "<<conclusion.high;
}
subarray FIND_CROSSING_SUBARRAY(int *A,int low,int middle,int high){
int sumleft=INT_MIN;
int sumright=INT_MIN;
int maxleft;
int maxright;
int sum1=0;
for (int i=middle;i>=low;i--){
sum1=sum1+A[i];
if(sum1>sumleft){
sumleft=sum1;
maxleft=i;
}
}
sum1=0;
for(int i=middle+1;i<=high;i++){
sum1=sum1+A[i];
if(sum1>sumright){
sumright=sum1;
maxright=i;
}
}
subarray data;
data.data=sumleft+sumright;
data.high=maxright;
data.low=maxleft;
return data;
}
subarray FIND_MAXINUM_SUBARRAY(int *A,int low,int high){
if (low==high){
subarray one;
one.data=A[low];
one.high=low;
one.low=low;
return one;
}else{
subarray leftmax;
subarray rightmax;
subarray cross;
int middle=(low+high)/2;
leftmax=FIND_MAXINUM_SUBARRAY(A,low,middle);
rightmax=FIND_MAXINUM_SUBARRAY(A,middle+1,high);
cross=FIND_CROSSING_SUBARRAY(A,low,middle,high);
if (leftmax.data>=rightmax.data&&leftmax.data>=cross.data)
return leftmax;
else if(rightmax.data>=cross.data&&rightmax.data>=leftmax.data)
return rightmax;
else if(cross.data>=rightmax.data&&cross.data>=leftmax.data)
return cross;
}
}
using namespace std;
struct subarray{
int low;
int high;
int data;
};
subarray FIND_CROSSING_SUBARRAY(int *A,int low,int middle,int high);
subarray FIND_MAXINUM_SUBARRAY(int *A,int low,int high);
int main()
{
int num;
int *data;
cout<<"请输入你想要求解数组的长度:"<<endl;
cin>>num;
cout<<"请依次输入你的数组:"<<endl;
data=new int(num);
for(int i=0;i<num;i++){
cin>>data[i];
}
subarray conclusion;
conclusion=FIND_MAXINUM_SUBARRAY(data,0,num-1);
cout<<conclusion.data<<" "<<conclusion.low<<" "<<conclusion.high;
}
subarray FIND_CROSSING_SUBARRAY(int *A,int low,int middle,int high){
int sumleft=INT_MIN;
int sumright=INT_MIN;
int maxleft;
int maxright;
int sum1=0;
for (int i=middle;i>=low;i--){
sum1=sum1+A[i];
if(sum1>sumleft){
sumleft=sum1;
maxleft=i;
}
}
sum1=0;
for(int i=middle+1;i<=high;i++){
sum1=sum1+A[i];
if(sum1>sumright){
sumright=sum1;
maxright=i;
}
}
subarray data;
data.data=sumleft+sumright;
data.high=maxright;
data.low=maxleft;
return data;
}
subarray FIND_MAXINUM_SUBARRAY(int *A,int low,int high){
if (low==high){
subarray one;
one.data=A[low];
one.high=low;
one.low=low;
return one;
}else{
subarray leftmax;
subarray rightmax;
subarray cross;
int middle=(low+high)/2;
leftmax=FIND_MAXINUM_SUBARRAY(A,low,middle);
rightmax=FIND_MAXINUM_SUBARRAY(A,middle+1,high);
cross=FIND_CROSSING_SUBARRAY(A,low,middle,high);
if (leftmax.data>=rightmax.data&&leftmax.data>=cross.data)
return leftmax;
else if(rightmax.data>=cross.data&&rightmax.data>=leftmax.data)
return rightmax;
else if(cross.data>=rightmax.data&&cross.data>=leftmax.data)
return cross;
}
}