概要
DPを用いて、時間計算量O(N)で求めることができます。
DPテーブルの定義
以降では以下のDPテーブルについて考えます。
dp[i][j][k]:=i日目までの献立を決めて、i+1日目以降カレーパンをj日、小豆パンをk日選択できない場合の数
例えば、初日に小豆カレーパンを選んだ場合の数は、dp[1][1][2](1日目まで献立を決め、カレーパンと小豆パンがそれぞれ1日、2日選べないため)となります。
初日の献立に制約はないので、DPテーブルの初期値は以下の通りになります。
dp[0][j][k]={10(ifj=0∧k=0)(elseif0≤j≤1∧0≤k≤2)
DPテーブルの遷移
このDPを送るDPと思って、dp[i][j][k]から遷移する方法を考えます。
まず、4種類のパンについてi+1日目に選択できるかどうかを以下の条件で判定できます。
- ノーマルパンはいつでも選択できます。
- カレーパンはj=0のときのみ選択できます。
- 小豆パンはk=0のときのみ選択できます。
- 小豆カレーパンはj=0∧k=0の時のみ選択できます。
つぎに、遷移先をdp[i+1][j′][k′]と置くと、j′,k′は以下のように求められます。
- ノーマルパンを選んだとき、j′=max(j−1,0),k′=max(k−1,0)
- カレーパンを選んだとき、j′=1,k′=max(k−1,0)
- 小豆パンを選んだとき、j′=max(j−1,0),k′=2
- 小豆カレーパンを選んだとき、j′=1,k′=2
求めたい答えはN日目のすべての場合の数の和になります。
ans=j=0∑1k=0∑2dp[N][j][k]