ARC006 C問題:積み重ね

問題. 積み重ね

 N 個のダンボールがある.ダンボールは 1 から N まで番号付けされており, i 番目のダンボールの重さは  w_i である.1番目のダンボールから順番に部屋に収納する.このとき, i < j に対して  w_i \ge w_j なら  i 番目のダンボールの上に  j 番目のダンボールを重ねることができる.ダンボールの山の数の最小値を答えよ.

制約 1 \le N \le 50,  1 \le w_i \le 10^5

解法1.DAGの最小道被覆問題

ダンボールを頂点として, i 番目のダンボールの上に  j 番目のダンボールを重ねることができるとき弧  (i, j) を張ることによって有向グラフ  G を構成する. G 上の1つの有向道とダンボールの山が対応するので,この問題は最小道被覆問題となる.また, G は明らかに DAG なので二部グラフの最大マッチング問題に帰着することができる.
 DAGの最小道被覆問題 - 忘れても大丈夫
したがって, O(N^2) 時間で有向グラフを構成して,フォード・ファルカーソン法を用いて二部グラフの最大マッチング問題を  O(N^3) 時間で解く(最大流は  \because N 以下).

計算時間 O(N^3)

解法2.貪欲法(解法1の高速化)

解法1で構成される二部グラフは下の図のように弧の端点集合に関して包含関係があるので, i 番目のダンボールはまだ選ばれていないダンボールで重さが  w_i 以下で  i の右側にある中で最も左にあるものを貪欲に選択することが最適となる(だぶん何か名前がついていた気がするけど・・・).
          f:id:tatanaideyo:20190529170545p:plain:w250

計算時間 O(N^2)

貪欲法の証明は最小道被覆からの帰着だと簡単だけど,経由しない方法だと難しい気がする. そんなことは無かった.