TopCoder SRM 550 Div1 Medium PuyoPuyo

問題

同じ色のぷよがL匹くっつくと消える。
筒にぷよぷよを一匹ずつ、合計N匹いれる。
全てのぷよを入れ終えたときに、筒の中が空になっているような、
ぷよの入れ方の場合の数を求めよ。

制約条件

2≦L≦20
N≦1000

方針

dp[i][j]を、ぷよをiひき入れたときに、
全てのぷよを消すのに最低で必要なぷよの数がjひきであるような状態の場合の数とする。


すると、次に同色のぷよを入れるか、そうでないかで漸化式が立ち、DPできる。

ソースコード

const int mod = (int)1e9 + 7;
int dp[1010][1010];

class PuyoPuyo {
  public:
  int theCount(int L, int N) {
		memset(dp, 0, sizeof(dp));
		dp[0][0] = 1;
		
		rep(i, N){
			(dp[i + 1][L - 1] += dp[i][0] * 4ll % mod) %= mod;
			for(int j = 1; j < N; j++){
				(dp[i + 1][j - 1] += dp[i][j]) %= mod;
				if(j + L - 1 < N) (dp[i + 1][j + L - 1] += dp[i][j] * 3ll % mod) %= mod;
			}
		}
		return dp[N][0];
  }
};