[Gold V] Title: 연속합 2, Time: 128 ms, Memory: 44996 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-04 23:50:05 +09:00
parent 431c07d05d
commit ee7d17fbc2
2 changed files with 54 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
# [Gold V] 연속합 2 - 13398
[문제 링크](https://www.acmicpc.net/problem/13398)
### 성능 요약
메모리: 44996 KB, 시간: 128 ms
### 분류
다이나믹 프로그래밍
### 제출 일자
2025년 3월 4일 23:49:52
### 문제 설명
<p>n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다. 또, 수열에서 수를 하나 제거할 수 있다. (제거하지 않아도 된다)</p>
<p>예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 수를 제거하지 않았을 때의 정답은 12+21인 33이 정답이 된다.</p>
<p>만약, -35를 제거한다면, 수열은 10, -4, 3, 1, 5, 6, 12, 21, -1이 되고, 여기서 정답은 10-4+3+1+5+6+12+21인 54가 된다.</p>
### 입력
<p>첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.</p>
### 출력
<p>첫째 줄에 답을 출력한다.</p>

View File

@@ -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)