ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Typical DP Contest M - 家

問題
提出コード

解法

bitDPです。だんだん詰め合わせ感が増えてきました。
m[i][j] = 同じ階層でiからjに移動するパターン数
とすると、これをR\times Rの行列に見立ててH乗すると、m[1][1]が答えになります。
m[i][j]を求めることさえできれば、あとはこの行列式2^{k}を求めていき、O(R^{2}logH)程度で答えが求まります。
ということで、この行列式を完成させることを考えます。
dp[i][j][S] = iからSの部屋を通り、jにいくパターン数
とします。部屋が16までしかないので、通る部屋の状態Sをビット列で持つことができます(自分は、スタート地点とゴール地点のi,j両方のビットも立てました)。
このとき、m[i][j]は、dp[i][j][S]の全ての状態Sに対する総和になります。
このDPは、スタート地点iから幅優先探索をすることで求めることができます。
今、Sの部屋を通り、jの部屋にいるとします。すると、Sに含まれていないかつ、jからいくことのできる部屋kについては、部屋k2^{k}で表されることを利用して、
dp[i][k][S+2^{k}] += dp[i][j][S]
という遷移を行えばよいです。
ということで、すべての部屋をスタート地点に選んだ幅優先探索を行い、このDPを埋めることで、m[i][j]を完成させることができます。
あとは、H乗すれば、答えが求まります。