import sys
input = sys.stdin.readline
def BOJ2156() :
n = int(input())
dp = [[0 for _ in range(3)] for _ in range(n)]
l = []
for _ in range(n) :
l.append(int(input()))
# dp[i][0] = 해당 잔을 마시지 않은 경우
# dp[i][1] = 앞의 잔을 마시지 않고 해당 잔을 마신 경우
# dp[i][2] = 앞의 잔을 마시고 해당 잔을 마신 경우
dp[0] = [0, l[0], l[0]]
for i in range(1, n) :
dp[i][0] = max(dp[i-1])
dp[i][1] = dp[i-1][0] + l[i]
dp[i][2] = dp[i-1][1] + l[i]
print(max(dp[n-1]))
BOJ2156()
접근 방법
1. 이전까지 포도주를 먹은 총 합이 현재의 선택에 영향을 미치게 된다. 그래서 dp(dynamic programming)을 선택하였다.
2. dp는 현재 포도주 잔에서의 상태에 따라 값을 가지는 배열이다.
- 포도주를 마시지 않는경우
- 이전의 포도주를 마시지 않고 해당 포도주를 마시는 경우
- 연속해서 포도주를 마시는 경우
3. 포도주를 마시지 않은 경우에는 이전의 선택중 가장 큰 값을 선택하게 한다.
4. 마지막 포도주를 무조건 마셔야 하는 조건이 없으므로 마지막 까지의 선택중 가장 큰값을 출력해준다.
https://www.acmicpc.net/problem/2156
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
이친수 [백준 2193] - python (0) | 2022.03.08 |
---|---|
쉬운 계단 수 [백준 10844] - python (0) | 2022.03.07 |
연속합 [백준 1912] - python (0) | 2022.03.05 |
계단 오르기 [백준 2579] - python (0) | 2022.03.04 |
게임 개발[백준 1516] - python (0) | 2022.03.03 |