C - テント (Tents) Editorial by Mitsubachi


以下のようなDPを考えます。

  • $dp[i][j] :=$ $i \times j$ の区画にテントを $0$ 個以上置く方法で $2$ 個以上のテントが置かれている行や列がない通り数(出入口の方向も区別する)
  • 実装の都合上、 $dp[i][0],dp[0][j]$ は $1$ とします。

    条件より、各行各列に置かれているテントの個数は $2$ 個以下です。また、テントの置かれている区画 $\left( i,j \right)$ で、 $i$ 行目と $j$ 列目の両方にテントが $2$ 個以上あるようなものはありません。
    ここで、テントが $2$ 個置かれている行が $i$ 個、 $2$ 個置かれている列が $j$ 個あるような通り数を考えます。これを $dp2[i][j]$ とします。

    初めに、 $2$ 個置かれている行の選び方は ${}_H C_i$ 通り、 $2$ 個置かれている列については ${}_W C_j$ 通りです。また、 $2$ 個置かれている行について、それらの中のテントの出入り口の方向は一意に定まり、テントの配置方法は ${}_{2i} C_2 \times {}_{2i-2} C_2 \times \cdots \times {}_2 C_2 = \frac{(2i)!}{2^i}$ 通りです。列についても同様に考えることができます。
    最後に、 $(H-i-2j) \times (W-2i-j)$ の領域には $2$ 個以上のテントが置かれている行や列がないようにテントを置くことができ、これらについては出入口の方向は $4$ 方向全て可能です。
    よって、 $dp2[i][j] = {}_H C_i \times {}_W C_j \times \frac{(2i)!(2j)!}{2^{i+j}} \times dp[H-i-2j][W-2i-j]$ となります。ただし、 $H-i-2j \geq 0,W-2i-j \geq 0$ を仮定しています。
    答えは $dp2[i][j]$ を $H-i-2j \geq 0,W-2i-j \geq 0$ について足し合わせたものから $1$ を引いたものです。 $1$ を引く理由はテントを置かない場合を考慮するためです。 ${}_H C_i ,{}_W C_j , (2i)! , (2j)! , 2^{i+j}$ は簡単な前準備で $O(1)$ で入手できるので、 $dp$ を求める方法を考えましょう。

    \(O(HW \max(H,W))\) 解法

    対称性があるので、 $i \leq j$ として構いません。 $i \times j$ の区画にテントは $i$ 個まで置くことができます。また、 $0 \leq k \leq i$ について、(出入口の方向を区別せず)テントを $k$ 個置く方法は ${}_i C_k \times {}_j P_k$ 通りです。よって、 $dp[i][j] = \sum_{k=0}^{i} 4^k \times {}_i C_k \times {}_j P_k$ となります。これより、 $dp[i][j]$ は $O(i)$ で計算できます。
    よって、 $dp$ は合計で $O(HW \max(H,W))$ で入手できるので、元の問題も $O(HW \max(H,W))$ で答えを求めることができます。これで小課題1を解くことができました。

    \(O(HW)\) 解法

    \(i \times j\) の区画の \(1\) 番左の列にどう置くかを考えましょう。 \(1\) つ置く場合、出入口の方向を含め置き方は \(4i\) 通りあり、残り \((i-1) \times (j-1)\) の区画には \(dp[i-1][j-1]\) 通りの置き方があります。 \(1\) つも置かない場合、残り \(i \times (j-1)\) の区画には \(dp[i][j-1]\) 通りの置き方があります。

    よって、 \(dp[i][j] = 4i \times dp[i-1][j-1] + dp[i][j-1]\) となり、 \(dp\)\(O(HW)\) で入手できるので、元の問題も \(O(HW)\) で答えを求めることができます。これで小課題2を解くことができました。

    posted:
    last update: