|
| 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]** |
0 commit comments