diff --git a/백준/Gold/13398. 연속합 2/README.md b/백준/Gold/13398. 연속합 2/README.md new file mode 100644 index 0000000..e740b36 --- /dev/null +++ b/백준/Gold/13398. 연속합 2/README.md @@ -0,0 +1,32 @@ +# [Gold V] 연속합 2 - 13398 + +[문제 링크](https://www.acmicpc.net/problem/13398) + +### 성능 요약 + +메모리: 44996 KB, 시간: 128 ms + +### 분류 + +다이나믹 프로그래밍 + +### 제출 일자 + +2025년 3월 4일 23:49:52 + +### 문제 설명 + +

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다. 또, 수열에서 수를 하나 제거할 수 있다. (제거하지 않아도 된다)

+ +

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 수를 제거하지 않았을 때의 정답은 12+21인 33이 정답이 된다.

+ +

만약, -35를 제거한다면, 수열은 10, -4, 3, 1, 5, 6, 12, 21, -1이 되고, 여기서 정답은 10-4+3+1+5+6+12+21인 54가 된다.

+ +### 입력 + +

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

+ +### 출력 + +

첫째 줄에 답을 출력한다.

+ diff --git a/백준/Gold/13398. 연속합 2/연속합 2.py b/백준/Gold/13398. 연속합 2/연속합 2.py new file mode 100644 index 0000000..bd67f33 --- /dev/null +++ b/백준/Gold/13398. 연속합 2/연속합 2.py @@ -0,0 +1,22 @@ +import sys + +input = sys.stdin.readline + +n = int(input()) +a = list(map(int, input().split())) + +# dp_no[i] : i번째 원소까지 고려할 때, 한 개도 삭제하지 않고 선택한 연속 부분합의 최댓값 +# dp_del[i] : i번째 원소까지 고려할 때, 한 개의 원소를 삭제한 상태에서의 연속 부분합의 최댓값 +dp_no = [0] * n +dp_del = [0] * n + +dp_no[0] = a[0] +dp_del[0] = -10**9 # 매우 작은 값으로 초기화 (첫 원소를 제거하면 빈 구간이 되어버리므로) + +result = a[0] +for i in range(1, n): + dp_no[i] = max(a[i], dp_no[i-1] + a[i]) + dp_del[i] = max(dp_del[i-1] + a[i], dp_no[i-1]) + result = max(result, dp_no[i], dp_del[i]) + +print(result)