BOJ 6048 Water Slides
문제 내용
마추픽추에 있는 어떤 워터슬라이드는 개의 미니 풀과 이들을 연결하는 개의 단방향 미니 슬라이드로 이루어져 있습니다. 각 미니 풀에는 1번부터 번까지의 번호가 붙어 있습니다. 1번 미니 풀로 입장하면 하나 이상의 미니 슬라이드를 통해서 번 미니 풀에 도착하게 됩니다. 1번을 제외한 모든 미니 풀은 그 풀로 들어오는 미니 슬라이드가 존재하고, 번을 제외한 모든 미니 풀은 그 풀에서 나가는 미니 슬라이드가 존재합니다. 또한, 모든 미니 풀에서 유한 개의 미니 슬라이드를 통하여 번 미니 풀에 도달할 수 있고, 사이클은 존재하지 않습니다.
번 미니 슬라이드는 번 미니 풀에서 번 미니 풀로 연결되며, 재미의 양을 나타내는 값 이 주어집니다. 워터슬라이드를 타면서 얻는 재미는 거쳐간 모든 미니 슬라이드의 재미의 합입니다.
베시는 이 워터슬라이드에서 최대의 재미를 얻고자 각각의 미니 풀에서 다음 미니 슬라이드를 선택할 수 있지만, 내려오는 동안 최대 번은 랜덤한 미니 슬라이드를 타게 됩니다. 가능한 최악의 경우의 재미를 최대화하고자 할 때, 베시가 확실하게 얻을 수 있는 재미의 값을 구하세요.
아래는 워터슬라이드의 예시입니다.
[1]
/ \
5 -> / \ <- 9
/ \
[2]---3---[3]
\__5__/이라고 하면, 베시의 선택에 따라 다음과 같은 상황이 될 수 있습니다.
- 1번 풀에서 재미 9짜리 슬라이드를 선택하면, 얻는 최종 재미는 9입니다.
- 1번 풀에서 재미 5짜리 슬라이드를 선택하면, 최선은 5+5=10이지만, 2번 풀에서 랜덤으로 3짜리 슬라이드를 타게 되면 8의 재미만 얻을 수 있습니다.
- 1번 풀에서 랜덤으로 재미 5짜리 슬라이드로 내려왔다면, 2번 풀에서 반드시 5짜리 슬라이드를 고를 수 있습니다.
따라서, 베시가 이 워터슬라이드에서 확실하게 얻을 수 있는 재미는 9입니다.
입력
첫 번째 줄에 , , 가 주어집니다. (, , )
다음 줄에 걸쳐서, 번째 미니 슬라이드의 시작점 , 끝점 , 재미의 값 가 한 줄에 주어집니다. (, , )
출력
문제의 정답을 출력합니다.
문제 풀이
스포일러
이 문제는 상대가 있는 게임이론 문제로 생각할 수 있습니다. 여기서 상대의 목표는 베시의 재미를 최소화하는 것이고, 상대는 초기값이 인 변수 를 가지고 다음과 같은 행동을 원하는 만큼 하거나 하지 않을 수 있습니다.
- 가 양수일 때, 를 1 감소시키고 베시가 다음으로 타게 될 슬라이드를 정합니다.
가 0이라면, 각 지점에서 베시의 최선의 선택은 누적되는 재미가 최대인 쪽을 고르면 됩니다. 이는 끝점에서 시작하는 DAG 역순의 DP로 구할 수 있습니다.
가 0이 아니라면, 베시의 현재 지점에서 를 1 소모할지 말지를 상대가 선택할 수 있습니다.
- 상대가 를 소모한다면 다음 상태는 을 가지고 선택된 미니슬라이드의 끝점으로 이동한 상태가 되며, 상대는 그때의 누적되는 재미가 최소인 쪽을 골라야 합니다.
- 소모하지 않는다면, 베시가 다음 미니슬라이드를 고를 수 있습니다. 이 경우 다음 상태는 를 가지고 미니슬라이드의 끝점으로 이동한 상태가 되며, 베시는 누적 재미가 최대인 쪽을 고릅니다.
상대는 다시 둘 중에서 최소를 골라야 합니다. (를 소모할지 말지를 선택해야 하기 때문)
이 과정을 DP로 구현하면, 시간과 공간으로 문제를 풀 수 있습니다.