[BOJ10211] Maximum SubArray
1 분 소요
[BOJ10211] Maximum SubArray
문제 링크
문제설명
- 유명한 문제인 최대부분배열을 구하는 문제이다.
코드리뷰
- 이전 포스팅 분할정복1을 보면 자세히 설명을 써놓았다.
- 다이나믹 프로그래밍이 아닌 분할정복을 이용하여 푼 코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
int arr[1005];
int N;
int MaxCrossingSubArr(int low, int mid, int high) {
int leftsum = -1000000;
int rightsum = -1000000;
int sum = 0;
for (int i = mid; i >= 0; i--) {
sum += arr[i];
if (sum > leftsum) leftsum = sum;
}
sum = 0;
for (int i = mid + 1; i <= high; i++) {
sum += arr[i];
if (sum > rightsum) rightsum = sum;
}
return leftsum + rightsum;
}
int MaxSubArray(int low, int high) {
if (low == high) return arr[low];
int mid = (low + high) / 2;
int lresult = MaxSubArray(low, mid);
int rresult = MaxSubArray(mid + 1, high);
int cresult = MaxCrossingSubArr(low, mid, high);
return max(lresult, max(rresult, cresult));
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
cin >> T;
for (int t = 1; t <= T; t++) {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
int result = MaxSubArray(0, N-1);
cout << result << '\n';
}
return 0;
}
댓글남기기