https://www.acmicpc.net/problem/2156
< 문제 >
개인적으로 생각하는데 꽤 시간이 든 문제..
지금 돌아보니 그렇게 오래 걸릴 문제는 아닌 것 같은데..
뭐, 다 그런게지.
< 풀이 >
이 문제에서의 포인트.
연속으로 놓여있는 3개 이상의 포도주를 마실 수 없다.
DP는 항상 어려운게, 점화식 하나 세우는게 힘들다.
작은 경우에서 큰 경우로 확장을 시키면서 점화식을 만들어야 하는게 DP의 포인트.
~식으로 ~처리가 되어서 결국 마지막에 x 값이 제일 큰 값이 된다. 라는 전개를 해야한다.
포도주의 용량을 담는 배열을 wine.
각각의 dp값을 담는 dp배열이 있을 때,
N개의 와인이 있으면, 시식하는 3가지의 경우가 발생한다.
1. N번째 와인을 마시고 N-1, N-3 와인을 마신다.
2. N번째 와인을 마시고 N-2 와인을 마신다.
3. N번째 와인을 마시지 않고, N-1 와인을 마신다.
위를 바탕으로 점화식을 세우면
1. wine[i] + wine[i-1] + dp[i-3]
2. wine[i] + dp[i-2]
3. dp[i-1]
우선, 초기값으로 dp[1], dp[2]를 각각 wine[1], wine[1] + wine[2]로 초기화.
3번째 부터는 위의 점화식을 바탕으로 서로 비교하여
최대로 큰 값을 dp[i]에 넣어준다.
dp[i] = MaxVal(wine[i] + wine[i-1] + dp[i-3], wine[i] + dp[i-2], dp[i-1])
< 소스 >
'BOJ' 카테고리의 다른 글
[BOJ][DP] 2167. 2차원 배열의 합 (0) | 2018.01.12 |
---|---|
[BOJ][DP] 11052. 붕어빵 (0) | 2018.01.09 |
[BOJ][DP] 11048. 이동하기 (0) | 2018.01.09 |
[BOJ][DP]9005 1,2,3 더하기 (0) | 2017.12.05 |
[BOJ][DP] 1932. 숫자삼각형 (0) | 2017.11.25 |