DP
[백준] 1912. 연속합 풀이
hch06
2025. 2. 5. 17:51
https://www.acmicpc.net/problem/1912
n개의 정수 수열을 받고, 연속된 수를 선택해서 가장 큰 값을 찾아내야 하는 문제이다.
우선, 선택할 수 있는 숫자의 개수는 제한이 없으므로 양수가 연속되어있다면 '무조건' 모두 선택해야한다.
이때 문제는 음수가 중간에 있더라도 이를 감안할 수 있는지를 확인하는 것이다.
10, -4, 3, 1, 5, 6, -35, 12, 21, -1
문제에서 제시한 것 처럼 위와같은 수열이 있다고 해보자.
우선 10을 선택해보자.
그 다음 숫자는 음수이고, 그 다음 숫자는 양수이다.
만약 음수 때문에 10에서 선택을 멈추면 3, 1, 5, 6까지 선택하여 더 큰 값을 만들어내는 상황을 만들지 못한다.
따라서 우선 10과 -4를 선택을 해보고 이 값의 합이 양수라면 다음에 오는 양수들을 선택하는 방식으로 가야한다.
즉,
왼쪽부터 차례로 검사할 때 이전에 선택된 숫자들의 합과 현재 검사하는 숫자와의 합이 음수라면 다시 현재 숫자에서부터 선택을 시작하고
양수라면 선택을 이어나가는 방식으로 해결할 수 있다. (다시 숫자를 선택하려는 시점에서 이전에 선택된 숫자들의 합에 대해 결과 출력을 위한 최댓값 갱신이 이루어져야 한다.)
C
더보기
#include <stdio.h>
int d[100001];
int main() {
int n; scanf("%d", &n);
int num[n];
for(int i = 0; i < n; i++) scanf("%d", &num[i]);
d[0] = num[0];
int max = d[0];
for(int i = 1; i < n; i++){
if(d[i-1] < 0) d[i] = num[i];
else d[i] = d[i-1] + num[i];
if(d[i] > max) max = d[i]; // 최댓값 갱신
}
printf("%d", max);
}
Python
더보기
d = [0 for _ in range(1000001)]
n = int(input())
num = [0 for _ in range(n)]
num = list(map(int, input().split()))
d[0] = num[0]
maxV = d[0]
for i in range(1, n):
if d[i-1] < 0: d[i] = num[i]
else: d[i] = d[i-1] + num[i]
if d[i] > maxV: maxV = d[i]
print(maxV)