출처: 백준 2156번 포도주 시식
연속으로 3잔을 마실 수는 없기 때문에 포도주를 마시는 방법은 총 3가지로 분류할 수 있다.
문제를 DP 방식으로 접근해, 현재까지 마신 포도주의 양을 쭉 저장해온다고 했을 때, 각 상황에 대해 더해줘야 하는 양은 아래와 같다.
각 상황에 대해서 값을 구한 후, 최댓값을 계속해서 마셔온 양에 저장하고 최종 값을 출력하면 된다.
n = int(input())
dp = [0]*n
number = [0]*n
for i in range(n):
number[i] = int(input())
if i == 0:
dp[0] = number[0]
elif i == 1:
dp[1] = number[0] + number[1]
elif i == 2:
temp1 = number[i]+number[i-1]
temp2 = number[i]+dp[i-2]
temp3 = dp[i-1]
dp[i] = max(temp1,temp2,temp3)
else:
temp1 = number[i]+number[i-1]+dp[i-3]
temp2 = number[i]+dp[i-2]
temp3 = dp[i-1]
dp[i] = max(temp1,temp2,temp3)
print(dp[n-1])
백준 2579번 계단 오르기 문제와 비슷한 부분이 많다. 이전 문제는 현재 계단을 오르지 않는다는 선택지가 없지만, 이 문제의 경우는 지금 와인 잔을 마시지 않는다는 선택지가 있어서 경우의 수가 하나 더 추가된다.
계단 오르기 문제는 백준 2579번 계단 오르기 문제 풀이에 풀이를 해두었다.