#define Inf 65535 #include <iostream> using namespace std; void FindMaxCrossingSubarray(int *Array, int low, int mid, int high, int &maxLeft,int &maxRight, int &sum); void FindMaxmumSubarry(int *Array,int low,int high, int &relow,int &rehigh,int &resum); void main() { int Array[]={13,-3,-25,20,-3,-16, -23,18,20,-7,12,-5,-22,15,-4,7}; cout<<"分治策略,求最大子数组"<<endl; int low,high,sum; FindMaxmumSubarry(Array,0,15,low,high,sum); cout<<"买入天数"<<low<<"卖出天数"<<high<<"总盈利"<<sum<<endl; system("pause"); } void FindMaxCrossingSubarray(int *Array, int low, int mid, int high, int &maxLeft,int &maxRight, int &sum) { int leftSum = -Inf; sum=0; for(int i=mid;i>low;i--) { sum=sum+Array[i]; if(sum>leftSum) { leftSum=sum; maxLeft=i; } } int rightSum = -Inf; sum=0; for(int j=mid+1;j<high;j++) { sum=sum+Array[j]; if(sum>rightSum) { rightSum=sum; maxRight=j; } } sum=leftSum+rightSum; } void FindMaxmumSubarry(int *Array,int low,int high, int &relow,int &rehigh,int &resum) { if (high==low) { relow=low; high=rehigh; resum=Array[low]; } else { int mid=(low+high)/2; int leftLow,leftHigh,leftSum, rightLow,rightHigh,rightSum, crossLow,crossHigh,crossSum; FindMaxmumSubarry(Array,low,mid,leftLow,leftHigh,leftSum); FindMaxmumSubarry(Array,mid+1,high,rightLow,rightHigh,rightSum); FindMaxCrossingSubarray(Array,low,mid,high,crossLow,crossHigh,crossSum); if (leftSum>=rightSum&&leftSum>=crossSum) { relow=leftLow; rehigh=leftHigh; resum=leftSum; } else if(rightSum>=leftSum&&rightSum>=crossSum) { relow=rightLow; rehigh=rightHigh; resum=rightSum; } else { relow=crossLow; rehigh=crossHigh; resum=crossSum; } } }