2018년 7월 8일 일요일

백준 2156 포도주 시식

d[i][x] = i번째 잔부터 연속 x잔을 마실 때, 최대로 마실 수 있는 포도주의 양

d[i][0] = max(d[i + 1][1], d[i + 1][2])
d[i][1] = d[i + 1][0] + wine[i]
d[i][2] = d[i + 2][0] + wine[i] + wine[i + 1]

이렇게 풀었는데, 틀렸다...
감사하게도 질문게시판에 반례를 올려주신 분이 있었다.
https://www.acmicpc.net/board/view/21703#comment-37134
8
7 7 0 5 7 7 0 3

d[i][0] = max(d[i + 1][1], d[i + 1][2]) -> 이 부분이 문제였다.
나는 i번째 포도주를 안 마시기로 했으면, 그 다음 포도주는 무조건 마셔야 최대값이 된다고 생각했는데, 이 것은 맨 앞인 경우만 해당된다. 맨 앞의 2개의 잔을 모두 안 마시면 최대가 아니기 때문에(맨 앞의 1개의 잔을 마시면 그게 더 크므로) 이렇게 생각했었는데, 중간 부분에서는 가운데 2개가 비어야 최대가 될 수 있는 경우도 있다.

예를 들면, o o x x o o 인 경우... 가운데 x x중 하나를 선택하게 되면 3잔 연속이 되니까, o를 하나 포기해야 한다. 이 때, x에 있는 값이 o에 있는 값보다 작으면 최대가 될 수 없다. 그래서 최대가 되기 위해 x x -> 이 부분을 선택하지 않아야 할 수 있다.

그래서
d[i][0] = max(d[i + 1][1], d[i + 1][2]) 
-> d[i][0] = max(d[i + 1][0], max(d[i + 1][1], d[i + 1][2])) 으로 수정하였고, AC를 받았다.

댓글 없음:

댓글 쓰기