문제
풀이
각 나라를 정점으로 생각하면 문제에서 주어지는 나라끼리의 관계는 포레스트로 나타낼 수 있습니다. 이때 포레스트를 이루는 노드의 루트(어느 나라의 속국도 아닌 나라)들의 부모 노드를 하나 만들어서 트리로 나타낼 수 있습니다. 이때 만든 가상의 부모 노드를 $r$이라 합시다.
노드 $u$의 서브트리에서 $i$만큼의 나라를 정복하기 위한 최소 시간을 $DP[u][i]$라 합시다. $u$의 자식 $v$에 대해 $DP[v][i]$를 배낭 문제의 물건처럼 생각하여 $DP[u][i]$를 구할 수 있습니다.
노드 $u$를 정복하는데 걸리는 시간을 $t_u$라 하고, 노드 $u$의 서브트리에 속하는 정점의 개수($u$ 포함)를 $\operatorname{size}(u)$라 합시다.
초기값으로 $DP[u][0] = 0$, $DP[u][\operatorname{size}(u)] = t_u$로 둡시다. 이제 아래의 점화식을 통해 $DP[u][i]$를 구할 수 있습니다.
\[\begin{gather} \text{for}\ 1 \le i \le \operatorname{size}(u), 1 \le j \le \min(\operatorname{size}(v), i) \\ DP[u][i] = \min_{\text{child}\ v}(DP[u][i - j] + DP[v][j]) \end{gather}\]답은 $\min_{i = M}^N(DP[r][i])$가 됩니다.
각 노드마다 $\operatorname{size}(u) \times \sum\operatorname{size}(v)$만큼의 계산이 필요합니다. $\operatorname{size}(u) = \mathcal{O}(N)$이고 $\sum\operatorname{size}(v) = \mathcal{O}(N)$이므로 시간 복잡도 $\mathcal{O}(N^3)$에 해결할 수 있습니다.
코드
1 | |