https://www.acmicpc.net/problem/2156
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
이전에 풀었던 계단 오르기 문제와 유사하면서 조건은 더 적다.
동일한 알고리즘으로 풀었더니 계속 오답이 나왔는데, 그 이유는 이동거리의 제약 조건이 더 적었기 때문이다.
계단 오르기 문제는 반드시 2칸 내에서 이동해야 하는데 이번 문제는 그런 제한이 없다.
동일 알고리즘을 적용하면
100 100 1 1 100 100 의 Test case에서 100 대신 1을 고르게 된다.
따라서 이 점을 고려해 문제를 풀어야한다.
n번째 포도주 앞의 두 포도주를 마시거나 마시지 않는 경우는 총 4가지이다.
XX (둘 다 마시지 않음)
XO (n-1번째 포도주만 마심)
OX (n-2번째 포도주만 마심)
OO (둘 다 마심 -> n 번째는 못 마시므로 제외)
또한 마지막 값 대신 그 앞의 값을 더했을 때 최대값이 나오는 경우가 존재한다.
이를 활용해 Optimal substructure를 구한다.
dp[i]의 값은
i = 1 >> cost[1]
i = 2 >> cost[1]+cost[2]
i >= 3 >> max(max(dp[i-3], dp[i-2], dp[i-3] + cost[i-1]) + cost[i], dp[i-1]
XX OX XO
이때 dp[i-3]은 dp[i-3] + cost[i-1]보다 반드시 작거나 같으므로 제외할 수 있다.
dp table을 채우고 나면 n행, n-1행 중 더 큰 값을 반환한다.
배운 내용 :
내가 생각했던 내용을 먼저 코드로 표현해보고 해당 코드에서 문제를 찾아 보완하는 방법을 사용하자
알고리즘만 떠올리면 코드는 금방 최적화 할 수 있다
'백준' 카테고리의 다른 글
백준 11054 - 가장 긴 바이토닉 부분 수열 (0) | 2023.05.13 |
---|---|
백준 11053 - 가장 긴 증가하는 부분 수열 (LIS) (0) | 2023.05.11 |
백준 2579 - 계단 오르기 (0) | 2023.05.09 |
백준 1932 - 정수 삼각형 (0) | 2023.05.08 |
백준 1149 - RGB거리 (0) | 2023.05.07 |