-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathMaximum Sum Subarray.cpp
More file actions
77 lines (67 loc) · 1.77 KB
/
Maximum Sum Subarray.cpp
File metadata and controls
77 lines (67 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define _INFINITY 1 << 30
#define M 1000001
/*
Maximum Sum Subarray Problem
O(N * log(N)) solution with divide & conquer
*/
using namespace std;
int n, i, j, k;
int a[M];
char ch;
int FindMaxCrossingSubarray(int A[M], int low, int mid, int high)
{
int leftsum = -_INFINITY;
int sum = 0;
int maxleft, maxright;
for(i = mid ; i >= low ; i --)
{
sum = sum + A[i];
if(sum > leftsum)
{
leftsum = sum;
maxleft = i;
}
}
int rightsum = -_INFINITY;
sum = 0;
for(j = mid + 1 ; j <= high ; j ++)
{
sum = sum + A[j];
if(sum > rightsum)
{
rightsum = sum;
maxright = j;
}
}
return (maxleft,maxright, leftsum + rightsum);
}
int FindMaximumSubarray(int A[M], int low, int high)
{
if(high == low) {
return (low, high, A[low]);
}
else {
int mid = (low + high) / 2;
int crosslow, crosshigh, crosssum;
int leftlow, lefthigh, leftsum, rightsum, rightlow, righthigh;
(leftlow, lefthigh, leftsum) = FindMaximumSubarray(A, low, mid);
(rightlow, righthigh, rightsum) = FindMaximumSubarray(A, mid + 1, high);
(crosslow, crosshigh, crosssum) = FindMaxCrossingSubarray(A, low, mid, high);
if(leftsum >= rightsum && leftsum >= crosssum)
return (leftlow, lefthigh, leftsum);
else if(rightsum >= leftsum && rightsum >= crosssum)
return (rightlow, righthigh, rightsum);
else return (crosslow, crosshigh, crosssum);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
cout << FindMaximumSubarray(a, 1, n) << endl;
return 0;
}