AtCoder Beginner Contest 225 G 問題 X
問題
提出解答
問題の概要
縦 行, 横 行からなるマス目がある. マス にバツ印を書くと, 点入る. 一方で, 1本の斜め線を引くごとに 点失う. ここで, 斜めに隣接するマスに対して, 斜め線はまとめて引くことができる. 最大で獲得できる点数を求めよ. ただし, 完成後の状態において, 各マスはバツ印が完成しているか, 全く斜め線が引かれていない状態でなくてはならず, どちらか1本のみが引かれていることは許されない.
制約
解法
各マスについて, 「バツ印をつける」か「バツ印をつけない」かという 択があり, 複数のマスに関する条件がたくさんある. このことから, Project Selection Problem (または, 燃やす埋める問題) という問題を解くことになる.
この問題は, 集合 から への関数 について, の評価値 を最大化する問題である. ここで, 評価値の計算方法は, 以下のような形が可能であり, これらの総和で表せる (, は整数, は 以上の整数, は 以下の整数を表すとする).
- のとき, 点
- のとき, 点
- のとき, 点
- のとき, 点
- のとき, 点
今回の問題へ帰着する. をマス目全体の集合とし, を各マス に対して, バツ印を書くならば, , 書かないならば, とする.
とさせたとき, 基本的には斜め線 本を書いて, 点を得ることから, のとき, 点得ると考える.
また, 斜めに隣接する つのマス目 に対して, この つのマス共にバツ印を書くと, 斜め線を 本省略できるので, 点だけ得する. よって, のとき, 点を獲得するという条件を追加する. この条件は であるから, 条件の条件を満たす.
Project Selection Problem (または, 燃やす埋める問題) はフローを用いて解くことになり, 計算量は や, として, である *1.
*1:コンテスト後, 運営から「この計算量で通ることが証明できる制約にすべきだった」というコメントが発表された