▶문제설명
[BOJ] 백준 2156. 포도주 시식
▶Hint
DP 문제이다.
[규칙]
- 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
- 연속으로 놓여 있는 3잔을 모두 마실 수는 없다.
규칙에 따르면, 하나의 잔 기준으로 세 가지 경우로 나눌 수 있다.
1. 이전 잔의 포도주를 마시고 현재 잔의 포도주를 마시는 경우
: A = dp[N-3] + glasses[N-1] + glasses[N];
[N-3] | [N-2] | [N-1] | [N] |
N-3번째 잔까지의 최대값 |
| 이 잔을 마시고 | 이 잔을 마심 |
2. 이전 잔의 포도주를 마시지 않고 현재 잔의 포도주를 마시는 경우
: B = dp[N-2] + glasses[N];
[N-2] | [N-1] | [N] |
N-2번째 잔까지의 최대값 | 이 잔을 마심 |
3. 현재 잔의 포도주를 마시지 않는 경우
: C = dp[N-1]
[N-2] |
[N-1] |
[N] |
N-1번째 잔까지의 최대값 |
N-1번째 잔까지의 최대값 |
이 세 가지 경우를 비교해서 가장 큰 경우를 dp테이블에 저장하면 각 위치에서 취할 수 있는 최대값을 구할 수 있다.
: dp[N] = max(max(A, B), C);
한 마디로 정리하면 dp[N]의 위치에
N-3번째 잔까지의 최대값 + N-1번째 잔 + N번째 잔
N-2번째 잔까지의 최대값 + N번째 잔
N-1번째 잔까지의 최대값
세 개의 값 중에 가장 큰 값을 저장하도록 구현하면 된다.
[초기값]
dp[0] = 0;
dp[1] = glasses[1];
dp[2] = glasses[1] + glasses[2];
▶Solution
'■ 알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[BOJ] 백준 2252. 줄 세우기 (0) | 2019.07.31 |
---|---|
[BOJ] 백준 3190. 뱀 (0) | 2019.07.19 |
[BOJ] 백준 1932. 정수 삼각형 (0) | 2019.07.10 |
[BOJ] 백준 2579. 계단 오르기 (0) | 2019.07.09 |
[BOJ] 백준 1022. 소용돌이 예쁘게 출력하기 (0) | 2019.07.08 |