かしのブログ

競技プログラミングとか

Typical DP Contest M - 家

問題

建物のH階部屋1から1階部屋1に移動するパターンを求める。 同じフロアでは部屋 i, j g_{i,j} = 1なら隣接していて、同じ部屋は2回通れない。 フロア間は同じ番号の部屋へ一方方向に降りるだけ。

atcoder.jp

考察

フロア内の移動

任意の部屋 iからスタートし、同じ部屋を通らずに移動して、部屋 jで階を降りるパターン p_{i, j}を求める。

部屋 sから通ってない残りの部屋の状態 sを保持しながら移動する。 現在の部屋 nから部屋 tに遷移できる条件は、 s_i = 1,  g_{n,t} = 1のときである。  p_{s, t}は、全ての状態で部屋 tに達するパターンの総和である。 全ての s \in [1, R]についてこれを計算する。

フロア間の移動

部屋 iから h階下の部屋 jに降りるパターンを q_{i, j, h}とする。  q_{i, j, h} = p_{i, j}である。

また、部屋 iから h_1階降りて、さらに h_2階降りて部屋 jに行くとき、 h_1階降りたときはどの部屋を経由しても良いので、

 q_{i, j, h_1 + h_2} = \sum_{n = 1}^R q_{i, n, h_1} q_{n, j, h_2}

高速累乗計算で q_{1, 1, H}を求める。

実装

atcoder.jp

感想

実行時間制限8sの問題は初めて見た。