AOJ 2293 - Dangerous Tower
解法
全て含めて、横の長さと箱が1:1に対応します。
なので、横の長さと箱をマッチングさせていくことを考えます。
箱について、
とマッチングさせる
とマッチングさせる
マッチングさせない
という3つの選択肢が存在します。
それぞれの場合について、高さがどれだけ増えるか、ということを考えると、
とマッチングさせる
→増加とマッチングさせる
→増加マッチングさせない
→増加なし
となります。
これを、コストに置き換えます。
はじめ、だけポイントを貰っていたとすると、それぞれの選択によるコストは、
とマッチングさせる
→のコストがかかるとマッチングさせる
→のコストがかかるマッチングさせない
→のコストがかかる
となります。
あとは、それぞれの箱をマッチングさせ、最小コストになるようにすればよいです。
これを求めるのに最小費用流を用います。
超頂点、箱を表す個の頂点、横の長さを表す頂点を用意します(横の長さを表す頂点は、の種類が個数になります)。
から箱の頂点それぞれにコスト0の辺を張る
箱の頂点から、を表す頂点にコストの辺を張る
箱の頂点から、を表す頂点にコストの辺を張る
箱の頂点から、にコストの辺を張る
横の長さを表す頂点から、にコスト0の辺を張る
という操作を行います。容量は全て1です。
あとは、からに、だけフローを流すときの最小コストを求めれば、
から引くことで答えが求まります。
感想
これと似ているな、と思って解いたので初めてマッチング問題を自力で解けました。いいですね。