[Gold V] Title: 연속합 2, Time: 128 ms, Memory: 44996 KB -BaekjoonHub
This commit is contained in:
32
백준/Gold/13398. 연속합 2/README.md
Normal file
32
백준/Gold/13398. 연속합 2/README.md
Normal 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>
|
||||
|
||||
22
백준/Gold/13398. 연속합 2/연속합 2.py
Normal file
22
백준/Gold/13398. 연속합 2/연속합 2.py
Normal 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)
|
||||
Reference in New Issue
Block a user