olpheの競プロ帖

競プロ問やアルゴリズム等の考察します

全国統一プログラミング王決定戦本戦-E Erasure

問題概要

N個のブロックが並んでおり、幅K+1以上の全ての区間がある。区間の数をM個とすると区間の選び方は2^M通りある。全てのブロックを選択できる区間の使い方は何通りか。

 

メモ

素直なDPをする方法と包除原理を用いる方法がある。

 

素直なDP

seicaさんから掲載許可を頂いた画像が非常にわかりやすい。

f:id:olphe:20190220184537j:plain

これを参考にしたAC提出

atcoder.jp

 

包除原理

ixmelさんに教えていただいた。

dp[i][j]を、i番目のブロックまで見て、i番目のブロックを(未来永劫)使わず、[0,i]でj個以上のブロックを使っていない場合の数と定義する。

分かりやすさのために、0番目のブロックとN+1番目のブロックを用意すると良い。

そうすると、dp[k][j]からdp[i][j+1]に遷移したいときに区間の幅とKから(k,i)での区間の選び方が求められる。

 

このままだと状態数がO(N^2)、遷移の種類がO(N)O(N^3)だが、二次目を偶奇のみ持つことで状態数をO(N)まで減らすことができ全体でO(N^2)となるので間に合う。

 

この解法でのAC提出

atcoder.jp