メモ化する。
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 件のコメント :
コメントを投稿