けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

第4回 ドワンゴからの挑戦状 予選 2018 D - ディスクの節約 (600 点)

木上で bit DP する感じ

問題概要

頂点数  N の根付き木が与えられる。各頂点  v には重み  x_{v} が付されている。

この根付き木はタスクの依存関係を表している。各頂点に対して、対応するタスクの「実行」と「削除」ができる。

  • 頂点  v のタスクを実行すると、ディスクに実行結果が記録されて、ディスク容量 (初期値は 0) に  x_{v} が加算される。
  • 頂点  v のタスクを削除すると、ディスクの実行結果が消去されて、ディスク容量は  x_{v} が減算される。

ただし、頂点  v のタスクを実行するためには、 v のすべての子頂点についてタスクが「実行」済み、かつ、「削除」前であることが必要である。

目的は、根頂点に対応するタスクを「実行」することである。その状態を達成するまでの過程の、ディスク容量の最大値をスコアとする。

スコアの最小値を求めよ。

制約

  •  1 \le N \le 20

解法

次の bit DP で解ける。

  • dp[S] ← 実行済みのタスク集合が  S の状態に至るまでの最大瞬間ディスク消費量

計算量は  O(N 2^{N}) となる。

コード

提出したコード