728x90
# Baekjoon 2156번: 포도주 시식
import sys
input = sys.stdin.readline
N = int(input())
cost = []
dp = [0] * N
for i in range(N):
cost.append(int(input()))
if N == 1:
dp[0] = cost[0]
elif N == 2:
dp[1] = cost[0] + cost[1]
else:
dp[0] = cost[0]
dp[1] = cost[0] + cost[1]
dp[2] = max(cost[0] + cost[2], dp[1], cost[1] + cost[2])
for i in range(3, N):
dp[i] = max(dp[i-2] + cost[i], dp[i-3] + cost[i-1] + cost[i], dp[i-1])
print(max(dp))
이번 문제는 Dynamic Programming 알고리즘 문제였다. 이 문제는 연속으로 세 잔을 마실 수 없다는 제한 때문에 동적 프로그래밍을 적용할 수 있다. 각 잔을 마시거나 마시지 않는 경우에 따라 최대 마실 수 있는 포도주의 양을 계산한다.
dp[i]번째는 max(dp[i-2] + cost[i], dp[i-3] + cost[i-1] + cost[i], dp[i-1])로 구할 수 있다.
1. i번째 잔을 마시지 않는 경우: dp[i-1]
2. i번째 잔을 마시고, i-1번째 잔은 마시지 않고, i-2번째 잔을 마시는 경우: dp[i-2]+cost[i]
3. i번째 잔을 마시고, i-1번째 잔도 마시는 경우: dp[i-3]+cost[i-1]+cost[i]
728x90
'BaekJoon' 카테고리의 다른 글
[Baekjoon/Python] 1149번: RGB거리(Dynamic Programming) (0) | 2024.10.24 |
---|---|
[Baekjoon/Python] 10026번: 적록색약(BFS) (0) | 2024.10.23 |
[Baekjoon/Python] 16928번: 뱀과 사다리 게임(BFS) (2) | 2024.10.18 |
[Baekjoon/Python] 1759번: 암호 만들기(BackTracking) (0) | 2024.10.11 |
[Baekjoon/Python] 15686번: 치킨 배달(BackTracking) (2) | 2024.10.11 |