// TEST2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
using namespace std;
#define INF -9999999
//求出穿过中点的最大子数组的大小
int MAX_cross_sum(int A[],int low,int mid,int high)
{
int max_cross;
int left_sum=INF;
int max_left=0;
int i=0;
int sum=0;
int right_sum=INF;//右边的最大值
int max_right=0;//右边的最大值时的编号.
//左边的最大
for(i=mid;i>=low;i--)
{
sum=sum+A[i];
if(sum>=left_sum)
{
left_sum=sum;
max_left=i;
}
}
//右边的最大
sum=0;
for(i=mid+1;i<=high;i++)
{
sum=sum+A[i];
if(sum>=right_sum)
{
right_sum=sum;
max_right=i;
}
}
max_cross=left_sum+right_sum;
return max_cross;
}
//返回三个数中的最大值
int max_three(int a,int b,int c)
{
if(a>=b&&a>=c)
return a;
else if(b>=a&&b>=c)
return b;
else
return c;
}
//返回两个值中的最大
int max_two(int a,int b)
{
if(a>=b)
return a;
else
return b;
}
int max_sub_arry(int A[],int low,int high)
{
if(low==high)
return A[low];
else if((high-low)==1)
return max_two(A[low],A[high]);
else
return max_three(MAX_cross_sum(A,low,(low+high)/2,high),
max_sub_arry(A,low,(low+high)/2-1),
max_sub_arry(A,((low+high)/2)+1,high));
}
int _tmain(int argc, _TCHAR* argv[])
{
int A[10]={-1,2,3,-9,-2,3,4,-2,6,-1};
//cout<<MAX_cross_sum(A,0,)
cout<<max_sub_arry(A,0,9)<<endl;
return 0;
}
分治策略__解决最大连续子数组的问题
最新推荐文章于 2021-07-18 10:55:56 发布