メモ化する。
memo[h][w]=ベースの幅がwのブロックに高さhまでブロックを置くときのパターン数
ある幅を長さK以下のブロックで埋めようとしたとき、どれくらいのパターンがあるかを前もって計算しておく。
const int H = 50 + 1;
const int W = 50 + 1;
lli pattern[W];
lli memo[H][W];
const lli mod = 1000000007;
lli rec(int w, int h, const int k)
{
if (h <= 0) return 1;
if (w <= 0) return 1;
if (memo[h][w] != -1) return memo[h][w];
lli sum = (rec(w, h - 1, k) * pattern[w]) % mod;
for (int b = 0; b < w; ++b) {
lli s = rec(b, h - 1, k);
lli t = pattern[b];
lli u = rec(w - b - 1, h, k);
sum += (((s * t) % mod) * u) % mod;
sum %= mod;
}
return memo[h][w] = sum;
}
class BricksN {
public:
int countStructures(int w, int h, int k)
{
fill(pattern, pattern + W, 0);
pattern[0] = 1;
for (int i = 0; i < W; ++i) {
for (int j = 1; j <= k; ++j) {
pattern[i + j] += pattern[i];
pattern[i + j] %= mod;
}
}
fill(&memo[0][0], &memo[H - 1][W], -1);
return rec(w, h, k);
}
};
0 件のコメント :
コメントを投稿