G - Haunted House 解説 by kyopro_friends


公式解説と本質的には同じです。

同じフロアの上下左右に隣接するマスを結合することで、問題は次のようになります。

「頂点に重みのついたDAGが与えられる。辺を高々1度逆走してよいとき、各頂点を始点とする経路に含まれる頂点の重みの和の最大値は?」

次のDPを考えます。

  • \(\mathrm{DP}_0[v]\)\(v\) からスタートし、逆走することなく移動したときの、経路に含まれる頂点の重みの和の最大値
  • \(\mathrm{DP}_1[v]\)\(v\) からスタートし、1回目の移動で逆走し、その後は逆走することなく移動したときの、経路に含まれる頂点の重みの和の最大値
  • \(\mathrm{DP}_2[v]\)\(v\) からスタートし、1回目の移動では逆走せず、それ以降で高々1度逆走してよいときの、経路に含まれる頂点の重みの和の最大値

求めるものは \(\max(\mathrm{DP}_2[v],\mathrm{DP}_1[v])\) です。

頂点 \(v\) の重みを \(A_v\)、頂点 \(v\) から移動可能な頂点の集合を \(D_v\) 、逆走で移動可能な頂点の集合を \(D'_v\) とすると、おおよそ次のような関係が成り立ちそうです。

  • \(\mathrm{DP}_0[v]=A_v+\max_{u\in D_v}\mathrm{DP}_0[u]\)
  • \(\mathrm{DP}_1[v]=A_v+\max_{u\in D'_v}\mathrm{DP}_0[u]\)
  • \(\mathrm{DP}_2[v]=A_v+\max_{u\in D_v}\max(\mathrm{DP}_1[u],\mathrm{DP}_2[v])\)

しかし、このままでは正しくありません。
\(\dots\to v_2 \xrightarrow{逆走} v_1 \to v_2 \to v_3 \to \dots\) のような経路に対して、もらうDPで \(\mathrm{DP}_1[v_2]\leftarrow \max(\mathrm{DP}_1[v_2], A_2+\mathrm{DP}_0[v_1])\) としてしまうと、\(A_{v_2}\) が二重にカウントされてしまうためです。

例:

3 1 3
1#1
111
111
1
1 1 1

これを防ぐために、DPの値として「最大値を達成するのは次にどの頂点に移動したときか」も保持し、同じ頂点に戻ってくるときは二重カウントしないようにします。

そうすると今度は、二重カウント防止のために引かれた \(A_v\) により最大値が最大値でなくなってしまう可能性があります。対策として、最大値だけでなく、次に移動する頂点が異なる2ndmaxまで持つようにすることで、最適解を求めることができます。

投稿日時:
最終更新: