본문 바로가기

알고리즘/백준

[백준] 2156번 : 포도주 시식

728x90

https://www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

마실수 있는 포도주 양의 최대값을 구하여라.

 

1. 포도주잔을 선택하면 모든 포도주를 마셔야하고, 원래위치에 다시 놓는다.

2. 연속으로 3개 놓여있는 포도주는 마실 수 없다.

 

테스트 케이스 분석

6
6
10
13
9
8
1

dp[1] = 6

dp[2] = 12

dp[3] = max(juice[1]+juice[3], dp[2])

dp[4] = max(dp[1]+juice[3]+juice[4] ,dp[2]+juice[4], dp[3])

점화식 : dp[n] = max(dp[n-3]+juice[n-1]+juice[n], dp[n-2]+juice[n], dp[n-1])

 

연속으로 놓여있는 3개의 포도주를 마실수 없으므로 4번째 포도주를 마실때에는

1. 첫번째까지 마신 포도주의 합 + 3번째 포도주 + 4번째 포도주

2. 두번째까지 마신 포도주의 합 + 4번째 포도주

3. 세번째까지 마신 포도주의 합

 

중에서 최대값을 선택하면 된다.

n = int(input())
item = []
for _ in range(n):
    item.append(int(input()))
if n > 2:
    dp = [0 for _ in range(n+1)]
    dp[0] = item[0]
    dp[1] = item[0]+item[1]
    dp[2] = max(dp[1], item[0]+item[2], item[1] + item[2])

    for i in range(3, n):
        dp[i] = max(dp[i-1], dp[i-2] + item[i], dp[i-3] + item[i] + item[i-1])

    print(dp[n-1])
else :
    if n == 1:
        print(item[0])
    if n == 2:
        print(item[0]+item[1])
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1520번 : 내리막길  (2) 2023.07.15
[백준] 9252번 : LCS2  (1) 2023.07.14
[백준] 1010번 : 다리 놓기  (0) 2023.07.13
[백준] 9251번 : LCS  (0) 2023.07.13
[백준] 12865번 : 평범한 배낭  (2) 2023.07.13