Files
baekjoon-study/workbook_7319/silver/2156-s1.py
2026-03-30 12:35:45 +09:00

45 lines
1.3 KiB
Python

# 포도주 시식
import sys
input = sys.stdin.readline
def solution():
n = int(input().rstrip())
lst = [0] * n
for i in range(n):
lst[i] = int(input().rstrip())
dp = [0] * n
dp[0] = lst[0]
if n >= 2:
dp[1] = lst[0] + lst[1]
if n >= 3:
dp[2] = max(lst[0]+lst[1], lst[1]+lst[2], lst[0]+lst[2])
for i in range(3, n):
dp[i] = max(dp[i-1], dp[i-2]+lst[i], dp[i-3]+lst[i-1]+lst[i])
print(dp[n-1])
return
solution()
"""
걸린 시간: 10분
시간 복잡도: n개의 dp 테이블을 채워야하기 때문에 O(n)이다.
해설: 2579(계단 오르기) 문제와 비슷하다.
다른 점은 1,2칸씩 가는 것이 강제되어 있지 않고, 자유롭게 칸을 왔다갓다 할 수 있다는 것이다.
하지만 최대로 마셔야하기 때문에 왔다갔다 할 필요는 없고, 3개가 연속되지 않게 최대한 촘촘하게 먹어야 한다.
dp[i]는 i번째 값을 선택할 경우와 선택하지 않을 경우에 따라 max 값을 선택하면 되고, 선택하지 않을 경우 dp[i-1]에서 가져오고,
선택할 경우, 바로 앞의 잔을 마셨다면 2번째 잔을 마시지 말았어야하고(dp[i-3]+lst[i-1]+lst[i]),
바로 앞의 잔을 안 마셨다면 2번째 전에서 값(dp[i-2]+lst[i])을 가져오면 된다.
"""