ICPC2017 Asia Regional Tsukuba A Secret of Chocolate Poles
問題
黒と白の円盤を積み上げてタワーを作る。タワーは以下の条件を満たす必要がある
- 一枚以上の円盤がある
- 円盤の厚さの合計はl以下
- 最も外側の円盤は黒
- 同じ色同士の円盤が隣り合ってはいけない
黒の円盤は厚さ1またはkのどちらかを選ぶことができて、白の円盤は厚さ1だけ。
条件を満たすタワーは何通りあるか。
制約条件
l≦100, k≦10
解法
今までの厚みの和と最後に使った色以外、これまでに何を積んだかは関係ないのでそれらをキーにするDPをすればよい。
intだとオーバーフローするので気を付ける。
ソースコード
int main(){ int l, k; cin >> l >> k; ll dp[110][2] = {}, ans = 0; dp[0][0] = 1; rep(i, l) rep(j, 2) if(dp[i][j]){ dp[i + 1][j ^ 1] += dp[i][j]; if(!j) dp[i + k][j ^ 1] += dp[i][j]; } rep(i, l) ans += dp[i+1][1]; cout << ans << endl; return 0; }