
Untitled
By: a guest on
May 6th, 2012 | syntax:
C++ | size: 1.66 KB | hits: 16 | expires: Never
#include <iostream>
#include <fstream>
using namespace std;
int * find_max_crossing(int * v,int left,int mid,int right)
{
int max_left = v[mid],
max_right = v[mid+1],
cr_left = v[mid],
cr_right = v[mid+1];
int * array = new int[3];
array[0] = mid;array[1] = mid+1;
for(int i = mid-1;i>=left;i--)
{
cr_left+=v[i];
if(cr_left > max_left)
{
max_left = cr_left;
array[0] = i;
}
}
for(int i = mid+2;i<=right;i++)
{
cr_right+=v[i];
if(cr_right > max_right)
{
max_right = cr_right;
array[1] = i;
}
}
array[2] = max_right + max_left;
return array;
}
int * find_max_subarray(int * v,int left,int right)
{
if(left == right)
{
int * array = new int [3];
array[0] = array[1] = left;
array[2] = v[left];
return array;
}
else
{
int mid = (left+right)/2;
int * crossing = find_max_crossing(v,left,mid,right);
int * left = find_max_subarray(v,left,mid);
int * right = find_max_subarray(v,mid+1,right);
if(crossing[3] > left[3] && crossing[3] > right[3])
return crossing;
if(left[3] > crossing[3] && left[3] > right[3])
return left;
return right;
}
}
int main()
{
ifstream in("ssm.in");
ofstream out("ssm.out");
int pos1,pos2,n;
in >> n;
int * v = new int[n];
for(int i = 0;i<n;i++)
in >> v[i];
int * res = find_max_subarray(v,0,n-1);
cout << res[2] << " " << res[1] << " " << res[0];
return 0;
}