[BOJ 4097] 수익
BOJ4097 수익
구간합의 최대값을 찾는 문제로 Dynamic Programming의 예제격인 문제이다. 효율이 나쁘면 O(n^3), 분할정복(divide-and-conquer)를 이용하면 O(nlogn), 그리고 DP를 이용하면 O(n)으로 해결할 수 있다.
Kadane's Algorithm 으로 해결할 수 있다. 참고로 이 알고리즘을 이용하면 2차원 배열의 최대 부분합도 O(n^3)으로 해결할 수 있다.
C++ code
int sum = 0;
int maxS = 0;
int begin = 1, end = -1;
int start = 1;
for (int i = 1; i <= T; i++) {
sum += L[i];
if (sum >= maxS) {
end = i;
maxS = sum;
begin = start;
}
else if (sum < 0) {
sum = 0;
start = i + 1;
}
}
// 배열이 모두 음수인 경우, 최댓값 하나만 찾는다.
if (end == -1) {
maxS = L[1];
for (int i = 2; i <= T; i++) {
maxS = max(maxS, L[i]);
}
}
printf("%d\n", maxS);
Python code
while True:
N = int(input())
if N == 0:
break
L = []
for _ in range(N):
L.append(int(input()))
max_sum = cur_sum = 0
max_start = max_end = -1;
cur_start = 0;
for cur_end, x in enumerate(L):
if cur_sum <= 0:
cur_start = cur_end
cur_sum = x
else:
cur_sum += x
if cur_sum > max_sum:
max_sum = cur_sum
max_start = cur_start
max_end = cur_end + 1
# max_sum is not a positive
if max_end == -1:
max_sum = L[0]
for cur_end, x in enumerate(L):
if x > max_sum:
max_sum = x
print(max_sum)
Author And Source
이 문제에 관하여([BOJ 4097] 수익), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ahj1592/BOJ-4097-수익저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)