본문 바로가기

Study/알고리즘 & 자료구조

[백준] 2156 - 포도주 시식

아이데이션

앞에서부터 값이 쭉 누적되면서, 이전 값을 사용할지말지를 결정하는 느낌으로 보아 다이나믹 프로그래밍으로 풀어야 하는
문제라고 생각했다.

현재의 위치에서 선택할 수 있는 경우의 수는 다음과 같다.

1. 현재 위치의 포도주를 먹지 않고, 직전까지의 누적 값을 그대로 가져온다. (연속으로 3번 먹는 경우 일 수도 있으므로!!)

2. 현재 위치의 포도주를 먹고, i - 2번째까지의 누적 값을 그대로 가져온다. (연속 3번이 아닌 것이 보장되므로!!)

3. 현재 위치와 직전 위치의 포도주를 먹고, i - 3번째 까지의 누적 값을 그대로 가져온다. (마찬가지로, 연속 3번이 아닌 것이 보장되므로!!)

이걸 관계로 나타내면,

cache[i] = max(cache[i - 1], cache[i - 2] + board[i], cache[i - 3] + board[i - 1] + board[i])

이렇게 된다!!

 

풀이

n = int(input())
board = [0] + [int(input()) for _ in range(n)]
cache = [0] * (n + 1)
cache[1] = board[1]

if(n > 1):
    cache[2] = board[1] + board[2]

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

print(max(cache))

'Study > 알고리즘 & 자료구조' 카테고리의 다른 글

[백준] 2193 - 이친수  (0) 2024.08.20
[백준] 10844 - 쉬운 계단수  (0) 2024.08.19
[백준] 9095 - 1, 2, 3 더하기  (0) 2024.08.15
[백준] 11727 - 2xn 타일링 2  (0) 2024.08.13
[백준] 11726 - 2xn 타일링  (0) 2024.08.12