AtCoder Beginner Contest 264 F問題 Monochromatic Path
問題
提出解答
問題の概要
行 列からなるマス目がある. 上から 行目, 左から 列目のマス (以降ではマス と呼ぶことにする) は ならば白, ならば黒である.
以下の操作から1つ選び, 実行することを 回以上行うことができる.
- なる整数 を選び, [tex R_i] 円支払った後, 上から 行目にあるマスの白黒を全て反転させる.
- なる整数 を選び, [tex C_j] 円支払った後, 左から 列目にあるマスの白黒を全て反転させる.
このとき, 次の目標を達成するためにかかる合計費用の最小値を求めよ.
- マス から「現在いるマスの右隣もしくは下隣のマスに移動する」を繰り返してマス に到達する経路のうち, 全てのマス (両端含む) の色が同じであるようなものが存在する.
制約
- は または
解法
以降ではマスの色を で表すことにする.
次のような問題に切り替える.
次の操作を行い, マス に到達したときにおける最小費用を求めよ.
- 以下の2つの操作を行うか行わないかを選び, 行うことを選んだ場合は実行する.
- 円払い, 行目のマスの白黒を全て反転させる.
- 円払い, 列目のマスの白黒を全て反転させる.
- マス に降り立つ.
- 次の操作をマス に到達するまで行う.
- 以下の2つの操作で可能な操作のうち, 1つを選び実行する (今いるマスをマス とする).
- マス の色とマス の色が異なるならば 円支払い, 行目のマスの白黒を反転させる. 同じならば何もしない. その後, マス に移動する.
- マス の色とマス の色が異なるならば 円支払い, 列目のマスの白黒を反転させる. 同じならば何もしない. その後, マス に移動する.
動的計画法で解くことにする. を以下で設定する.
- マス に到達し, 列目の白黒を反転してい (: ない, る), 列目の白黒を反転してい (: ない, る) 状態における最小費用
ここで, の各要素は全て で初期化し, については を省略した表記とする.
ベースケースは のときであり, このときは降り立つ前に色の反転を行うことから,
である.
更新式について考える. のとき, マス の色は *1である.
下に移動するとき (), マス の色は である. よって,
- ならば .
- ならば .
となる.
右に移動するとき () も同様にして,
- ならば .
- ならば .
となる.
この動的計画法により, 最終解答は である. 計算量は である.
*1: の元を の元を埋め込んでいる