問題はこちら
問題概要
のマス目が白か黒に塗られており,塗られていないマスもある.塗られていないマスを白か黒で塗るとき,隣り合ったマスが異なる色で塗られているようなマスの組の数の最大値を求めよ.解説
隣り合ったマスに異なる色を塗った場合1点得るというように考える.
以下の条件で利得の最大化を行うことになる.
- まだ塗られていないマスを白で塗る.
- まだ塗られていないマスを黒で塗る.
- 隣り合ったマスに異なる色を塗ると点得る.
白/黒で塗るという選択と, 複数の選択の間に対する制約(罰則条件)があるのでProjectSelectionProblem(俗にいう燃やす埋める問題)を解くアルゴリズムを使えそう.
ProjectSelectionProblemについてはこちら
上の条件は利得になっているのでProjectSelectionProblemに対応させるため損失に書き直す.
- 白が塗られているマスを白で塗ると, 点を失う.
- 白が塗られているマスを黒で塗ると, 点を失う.
- 黒が塗られているマスを白で塗ると, 点を失う.
- 黒が塗られているマスを黒で塗ると, 点を失う.
- まだ塗られていないマスを白/黒で塗ると, 点を失う.
- 隣り合ったマスに異なる色を塗ると点失う.
隣り合ったマスの組の数からこれの解を引けば答えになる.また,が偶数のときと奇数のときで白/黒の選択を表す辺の並びを変える必要がある.
例として隣り合った「黒に塗られたマス」と「塗られていないマス」の状況をグラフで表すと以下のようになる. 頂点が既に黒に塗られたマスを表し, 頂点がまだ塗られていないマスを表す.
このグラフのSからTへの最大流が答え.容量0の辺はどうせ流れないので張らなくてもいい.
燃やす埋める問題に関する基礎知識は以下の記事を参考にしてください.
kanpurin.hatenablog.com
ProjectSelectionProblemの他の問題は以下にまとめています.
kanpurin.hatenablog.com
提出プログラム
https://atcoder.jp/contests/abc193/submissions/20555264感想
AtCoderでProjectSelectionProblemは解いたことなかった(忘れてるだけor精進足らず)のでおもしろかった.追記
普通にありました.(ネタバレ回避のため載せませんが)