#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
/*最大子数组问题的分治算法*/
#define INT32_MIN (1<<29)
/*
* find a subarray crossing the mid with the biggist sum
*/
int find_max_crossing_subarray(vector<int> array, int low, int mid, int high)
{
int left_maxsum = -50; //for sum
int right_maxsum = -50; //for sum
int sum = 0;
for (int i = mid; i >= low; --i)
{
sum += array[i];
if (sum > left_maxsum)
{
left_maxsum = sum;
}
}
sum = 0;
for (int i = mid + 1; i <= high; ++i)
{
sum += array[i];
if (sum > right_maxsum)
{
right_maxsum = sum;
}
}
return(left_maxsum + right_maxsum);
//cout<<"maxsum_crossing_mid"<<left_maxsum+right_maxsum<<endl;
}
int max(int a, int b, int c)
{
if (a >= b && a >= c)
return a;
else if (b >= a && b >= c)
return b;
else
return c;
}
/*
* find a subarray on the left or right side of mid
*/
int find_max_subarray(vector<int> array, int low, int high)
{
if (low == high)
{
return array[low];
}
int mid = int((low + high) / 2);
int low_maxsum = find_max_subarray(array, low, mid);
int high_maxsum = find_max_subarray(array, mid + 1, high);
int crossing_mid_maxsum = find_max_crossing_subarray(array, low, mid, high);
return max(low_maxsum, high_maxsum, crossing_mid_maxsum);
}
int main()
{
vector<int> array;
for (int i = 0; i<10; i++)
{
int j = 50 - rand() % 100; //-49~50
array.push_back(j);
}
for (vector<int>::iterator it = array.begin(); it != array.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
int maxsum = find_max_subarray(array, 0, array.size() - 1);
cout << "the maxsum=" << maxsum << endl;
return 0;
}
最大子数组问题的分治算法
最新推荐文章于 2024-10-15 19:53:59 发布