Skip to content

Commit 9965432

Browse files
committed
post: [14주차_채승희] 연속합 2
1 parent 15d471d commit 9965432

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
---
2+
title: 🐹 연속합 2
3+
author: chaeshee0908
4+
date: 2024-01-21 17:00:00 +09:00
5+
categories: [알고리즘, 연속합 2]
6+
tags: [알고리즘, 백준, 골드5, DP, 14주차, 채승희]
7+
render_with_liquid: false
8+
---
9+
10+
## 1. 문제 링크
11+
12+
[13398번: 연속합 2](https://www.acmicpc.net/problem/13398)
13+
14+
<br>
15+
16+
## 2. 코드
17+
18+
`Python3` `42828KB` `204ms`
19+
20+
```python
21+
INF = int(1e9)
22+
23+
n = int(input())
24+
numbers = list(map(int, input().split()))
25+
dp = [[0] * 2 for _ in range(n)]
26+
dp[0][0] = numbers[0]
27+
dp[0][1] = numbers[0]
28+
29+
for i in range(1, n):
30+
# 숫자를 제외하지 않을 경우
31+
dp[i][0] = max(dp[i-1][0] + numbers[i], numbers[i])
32+
# 하나의 숫자를 제외할 경우
33+
dp[i][1] = max(dp[i-1][0], dp[i-1][1] + numbers[i])
34+
35+
result = -INF
36+
for d in dp:
37+
result = max(result, max(d))
38+
print(result)
39+
```
40+
41+
<br>
42+
43+
## 3. 해설
44+
45+
dp 테이블을 연속합에서 하나의 숫자를 제외하지 않은 경우 ‘0’과 제외한 경우 ‘1’을 구분하여 이차원 배열로 초기화한다.
46+
47+
숫자 한 개 이상은 무조건 사용해야 하므로 dp[0]의 시작을 두 케이스 모두 수열의 가장 첫 값으로 초기화한다.
48+
49+
- 숫자가 제외되지 않은 연속합의 최댓값 `dp[i][0]`
50+
51+
(이전까지 합해온 숫자 + 현재 본인의 값)과 (현재 본인의 값)을 비교해봤을 때 (현재 본인의 값)이 더 크다면 이전 합을 추가해줄 필요가 없다.
52+
53+
`dp[i-1] + numbers[i]` (이전까지 합해온 숫자 + 현재 본인의 값) / `numbers[i]` (현재 본인의 값)
54+
55+
**dp[i][0] = max(dp[i-1][0] + numbers[i], numbers[i])**
56+
57+
- 숫자가 제외되었을 때 연속합의 최댓값 `dp[i][1]`
58+
59+
dp[i][1]은 현재까지 숫자 하나는 무조건 제외된 상태를 의미한다.
60+
61+
두 가지 경우 중 큰 경우를 고르면 된다.
62+
63+
1. 현재 수까지는 한 번도 제외하지 않았고, 현재 값을 제외할 경우 → `dp[i-1][0]`
64+
2. 이미 앞에서 제외한 경우에 현재 값을 더하는 경우 → `dp[i-1][1] + numbers[i]`
65+
66+
**dp[i][1] = max(dp[i-1][0], dp[i-1][1] + numbers[i]**
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)