BOJ 16297 Eating Everything Efficiently
문제 내용
마가렛은 지금 피자 축제에 와 있습니다. 이 축제에는 개의 피자 가게가 개의 단방향 통로로 연결되어 있으며, 사이클은 존재하지 않습니다. 모든 피자 가게는 번 피자 가게로부터 직접 또는 간접적으로 연결되어 있습니다.
마가렛은 피자를 2판까지밖에 먹지 못하지만, 다음의 전략을 사용하여 많은 피자들을 맛보려고 합니다.
- 맨 처음 먹을 피자는 1판을 모두 먹습니다. 다음 피자는 판을 먹고, 그 다음 피자는 판을 먹고, … 번째 피자는 판을 먹습니다.
마가렛은 축제장 밖으로 나갈 때까지 만나는 각각의 피자에 대해 먹을지 말지를 선택할 수 있습니다. 마가렛은 피자를 먹을 때마다 그 피자의 맛과 그 피자를 먹은 양을 곱한 값만큼의 만족감을 얻습니다. 만족감의 합의 최댓값을 구하세요.
입력
첫 번째 줄에는 피자 가게의 수 과 통로의 개수 이 주어집니다. (, )
두 번째 줄에는 0번, 1번, …, 번 피자 가게에서 먹을 수 있는 피자의 맛 이 주어집니다. 이들은 음이 아닌 정수입니다. ()
다음 줄 각각에는 각 통로의 시작점 와 끝점 가 주어집니다. (, ) 같은 쌍은 여러 번 주어지지 않습니다.
출력
마가렛이 얻을 수 있는 만족감의 합의 최댓값을 출력합니다. 정답과의 절대 또는 상대 오차가 이하이면 정답으로 인정됩니다.
문제 풀이
스포일러
주어진 그래프는 DAG이며, 다음과 같은 DAG DP를 할 수 있습니다.
각 점에서는 지금 방문한 가게의 피자를 먹을지 말지를 선택할 수 있습니다. 이 피자를 먹지 않는다면, 이 지점에서 시작하여 얻을 수 있는 최대 만족감은 다음 방문한 지점에서 시작하여 얻을 수 있는 최대 만족감과 같습니다. 이 피자를 먹는다면, 다음 방문한 지점부터 먹을 모든 피자에서 얻는 만족감은 절반이 되므로, 최대 만족감은 이 피자의 맛과 다음 지점의 최대 만족감의 절반을 더한 것과 같습니다.
이를 이용하여, 각 지점에서 시작했을 때의 최대 만족감을 구하는 DAG DP를 할 수 있습니다.