您的位置:首页 > 其它

分治法之求最大连续子序列和

2017-03-05 11:52 225 查看
对原问题有如下解

1.最大子序列在数组中点的左边

2.最大子序列在数组中点的右边

3.最大子序列跨越数组中点

#include<iostream>
using namespace std;
int FIND_MAX_CROSSING_SUBARRAY(int a[],int low,int high)
{
int mid = (low+high)/2;
int i = mid;
int j = mid+1;
int left_sum = 0;
int right_sum = 0;
int sum = 0;
while(i>=low){
sum += a[i];
if(sum>left_sum)    left_sum = sum;
i--;
}
sum = 0;
while(j<=high){
sum += a[j];
if(sum>right_sum)   right_sum = sum;
j++;
}
return left_sum+right_sum;
}

int FIND_MAXIMUM_SUBARRAY(int a[],int low, int high)
{
if(low == high)     return a[low];
int mid = (low+high)/2;
int left_sum = FIND_MAXIMUM_SUBARRAY(a,low,mid);
int right_sum = FIND_MAXIMUM_SUBARRAY(a,mid+1,high);
int cross_sum = FIND_MAX_CROSSING_SUBARRAY(a,low,high);
if(cross_sum>left_sum && cross_sum>right_sum)   return cross_sum;
if(left_sum>cross_sum && left_sum>right_sum)    return left_sum;
if(right_sum>left_sum && right_sum>cross_sum)   return right_sum;
}
int main()
{
int a[10] = {-1,0,23,414,-231,11,4234,-131323,1321,321};
cout<<FIND_MAXIMUM_SUBARRAY(a,0,9);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: