[BOJ 4097] 수익

1695 단어 DPbojCpythonPypy3C

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)

좋은 웹페이지 즐겨찾기