条件の正規化
この問題の制約について、以下の3つの性質が成り立ちます。
①が同一でのみが異なる条件が複数ある場合、最もが小さい条件のみを考慮すれば他の条件は考慮する必要はありません。
(最もが小さい条件のみを考慮すれば、他の条件は自動的に満たされます。)
したがって各について最もが小さい条件のみを残すことで、高々個の条件のみを残して他を無視することができます。
②また、2つの条件[, ], [, ] ()であって、となる条件がある場合、
これらの条件を[, ], [, ]と置き換えても良いことも分かります。
③最後に、あるについてそこから始まる制約が一つもない場合ですが、これはとなる全ての制約に渡っての最小値を取った値をとして、制約を問題に追加しても構いません。この条件は他の条件が満たされれば自動的に満たされます。
これらの3つの性質から、任意の条件は以下のような個の条件に置き換えることができることが分かります。
[, ], [, ], ... [, ] ()
(ただし、となる条件は任意の数列について常に満たされているとみなします。)
これを数列[, , ..., ]と同一視します。
の計算は愚直に行ってで可能です。
DP
以下のDPを考えます。
(長さの01列で、全ての条件を満たすものの個数)
長さの数列が与えられたとき、その末尾にもしくはのうち
現在数列の末尾ではない方の数字を高々個付け加えた数列も
全ての条件を満たしているため、
配るDPとしてからの遷移は以下のように書くことができます。
計算量はO()です。
累積和等を用いてDPの遷移をO()にすることで、この問題をO()でも解くことができます。