全国統一プログラミング王決定戦本戦-E Erasure
問題概要
N個のブロックが並んでおり、幅K+1以上の全ての区間がある。区間の数をM個とすると区間の選び方は通りある。全てのブロックを選択できる区間の使い方は何通りか。
メモ
素直なDPをする方法と包除原理を用いる方法がある。
素直なDP
seicaさんから掲載許可を頂いた画像が非常にわかりやすい。
これを参考にしたAC提出
包除原理
ixmelさんに教えていただいた。
dp[i][j]を、i番目のブロックまで見て、i番目のブロックを(未来永劫)使わず、[0,i]でj個以上のブロックを使っていない場合の数と定義する。
分かりやすさのために、0番目のブロックとN+1番目のブロックを用意すると良い。
そうすると、dp[k][j]からdp[i][j+1]に遷移したいときに区間の幅とKから(k,i)での区間の選び方が求められる。
このままだと状態数が、遷移の種類がでだが、二次目を偶奇のみ持つことで状態数をまで減らすことができ全体でとなるので間に合う。
この解法でのAC提出