2017ACM-ICPC アジア地区大会 問題A

 意外にもあっさり解けたので解法を残しておきます。たぶんオーソドックスな動的計画法でしょう。

 

 漸化式を次のように定めます。

 dp[i] := 黒、白、黒、…黒の順番でチョコレートが積まれていて、なおかつ高さがちょうど i になるようなチョコレートの積み方の総数

 

 ここで、何らかの形で黒、白、黒、…黒の順番でチョコレートを積み上げることができているとします。この時、さらにその上にチョコレートを積み上げる方法としては、

(1')厚さ1の白いチョコレートを載せ、さらにその上に厚さ1の黒いチョコレートを載せる

(2')厚さ1の白いチョコレートを載せ、さらにその上に厚さ k の黒いチョコレートを載せる

の2通りしかありません。

 

 

 このことから、高さがちょうど i になるようにチョコレートを積み上げるためには、

(1)高さ i - 2 の状態から(1')のようにチョコレートを積む

(2)高さ i - (k + 1) の状態から(2')のようにチョコレートを積む

(3)高さ i の黒のチョコレートを1つだけ地べたに置く ( i = 1, k の場合のみ)

のいずれかになることが分かります。

 

 ゆえに、i = 1 or i = k のとき dp[i] = 1、それ以外のとき dp[i] = 0 となるように dp[i] を初期化し、漸化式 dp[i] += dp[i - 2] + dp[i - (k + 1)] を満たすようにループを回せば、計算量O(l)でこの問題を解くことが可能です。