Codeforces #661 Div3 - F. Yet Another Segments Subset

問題リンク

100位切れたのはうれしいね

f:id:jupiro:20200806144412p:plain

解説

見た目が区間dpと書いてあるので、まずは区間dpを定義します。

 dp[l][r] := [l, r)にあるセグメントの数の最大値

そうすると右端をソートして(右端が同じ場合左端が右にあるものから)左から見ていきます。

そうすると、セグメントが [l , r)のとき、 i \leq lにおいて

 dp[i][r] \leftarrow \max(dp[i][r], dp[i][l] + dp[l][r] + 1)

となります。l r - 1に関しては左端右端が被る分には問題がないことに注意しましょう。

あとは区間を取らない場合に注意すればこの問題は解けました。(区間が無駄に大きいので座圧しておきましょうね)

計算量は O(n ^ 2)です。

提出コード

codeforces.com