Computer Science/Algorithm
[BOJ] 2156 - 포도주 시식
JG Ahn
2020. 6. 14. 18:33
풀이
DP 문제이다. 입력 데이터를 처음부터 살펴보면서 선택의 최댓값을 찾을 것이다.
문제 조건에서 3번 연속으로 포도 잔을 선택할 수 없기 때문에 다음과 같은 경우를 생각해본다.
- 현재가 0번 연속, 즉 i-2, i-1번이 선택되었다
- 현재가 1번 연속, 즉 i-2, i 번이 선택되었다
- 현재가 2번 연속, 즉 i-1, i 번이 선택되었다
변수 설명
- data : i 번째 입력 값
- dp : i 번째 최댓값
Python3 Code
import sys
n = int(sys.stdin.readline())
data = [0] + [int(sys.stdin.readline()) for _ in range(n)] + [0]
dp = [0] * (n+2) # i번째 최댓값
dp[1], dp[2] = data[1], data[1] + data[2]
for i in range(3, n+1):
x = dp[i-1] # 연속 0
y = dp[i-2] + data[i] # 연속 1
z = dp[i-3]+ data[i-1] + data[i]# 연속 2
dp[i] = max(x, y, z)
print(dp[n])