//分治策略
#include<iostream>
using namespace std;
struct subarray //返回一个下标元组划定跨越中点的最大子数组的边界,并返回最大子数组中值的和
{
int left;
int right;
int sum;
}sub,subL,subR,subC;
subarray FIND_MAX_CROSSING_SUBARRAY(int *a,int low,int mid,int high)
{
int leftSum = -65535;
int rightSum = -65535;
int leftMax=0;
int rightMax=0;
int sum = 0;
for(int i=mid-1;i>=low-1;--i)
{
sum += a[i];
if(sum>leftSum)
{
leftSum = sum;
leftMax = i+1;
}
}
sum = 0;
for(int j=mid;j<high;++j)
{
sum += a[j];
if(sum>rightSum)
{
rightSum = sum;
rightMax = j+1;
}
}
sub.left = leftMax;
sub.right = rightMax;
sub.sum = leftSum + rightSum;
return sub;
}
subarray FIND_MAXIMUM_SUBARRAY(int *a,int low,int high)
{
int mid = 0;
if(low == high)
{
sub.left = low;
sub.right = high;
sub.sum = a[low-1];
return sub; //base case: only one element
}
else
{
mid = (low+high)/2;
subL = FIND_MAXIMUM_SUBARRAY(a,low,mid);
subR = FIND_MAXIMUM_SUBARRAY(a,mid+1,high);
subC = FIND_MAX_CROSSING_SUBARRAY(a,low,mid,high);
if(subL.sum>=subR.sum && subL.sum>=subC.sum)
return subL;
if(subR.sum>=subL.sum && subR.sum>=subC.sum)
return subR;
else
return subC;
}
}
int main()
{
int arr[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int num = sizeof(arr)/sizeof(arr[0]);
subarray subA;
subA= FIND_MAXIMUM_SUBARRAY(arr,1,num);
cout<<subA.left<<ends<<subA.right<<ends<<subA.sum<<endl;
return 0;
}
最大子数组问题
最新推荐文章于 2023-09-20 10:20:46 发布