Official
B - Movies Editorial by maroonrk_admin
区間と点のマッチングに関する問題です. まず,区間の集合が与えられたときの解法として,以下のものを考えます.
- 左端の位置が降順になるように区間を並び替える. 各区間 \([l,r]\) について,\([l,r]\) 内に未マッチの点があるなら,そのうち最大のものとマッチさせる.
この貪欲をもとにDP をします. すべての区間を \(L_i\) の降順に並べておきます. \(dp[k][l][r]\) を次のように定義します.
- \(i \leq k\), \(l-1\leq R_i \leq r\) を満たす区間 \(i\) 全体の subset であって,「上述の貪欲を行ったとき点 \(l,\cdots,r\) がすべてマッチするが,点 \(l-1\) はマッチしない」ようなものの数.
\(dp[k] \to dp[k+1]\) の変化を考えます. 区間 \(k+1\) を使わないケースは \(dp[k+1][l][r]+=dp[k][l][r]\) なので簡単です. 区間 \(k+1\) を使うケースを考えます.明らかに \(l-1 \leq R_{k+1} \leq r\) をみたす \(dp[k][l][r]\) だけが影響を受けます.
- \(l \leq L_{k+1}\) のとき,\(dp[k+1][l][r]+=dp[k][l][r]\) とすればよいです.
- \(L_{k+1}<l\) のとき,点 \(l-1\) と区間 \(k+1\) がマッチします. この時,\(l-1\) 未満の最大の未マッチ点を選ぶ必要があります.これを点 \(c-1\) とすれば,\(dp[k+1][c][r]+=dp[k][c][l-1] \times dp[k][l][r]\) という遷移になります.
以上を実装すると計算量 \(O(N^5)\) の解法になります. 定数倍が小さいため,これで十分通ります.
posted:
last update: