🙌
ABC 196/D - Hanjo
問題概要
解法
公式解説を見てしまうと, DFS で全ての置き方を試すとだけある. 計算量を見積もることは出来るので分かっていれば問題ないが, 予め計算量の上限を与えるような解き方を与える.
各マスには次の3つの状態がある.
- ピースが置かれていない
- ピースが横向きに置かれている
- ピースが縦向きに置かれている
これを考えると
もう少し丁寧に, 次のように細分化する
-
マスの内,HW マスを選んで,A - そこから横(右)方向または縦(下)方向にピースを置く
というのを考えるとこの全通りは
という上限が与えられる. これならバリデーションに
for iset in range(1 << A):
# iset の i-th bit が立ってるかどうかでどうこうする
一方
ans = 0
for p in binom(H * W, A): # binom{mn}{a}
for q in range(1 << A):
# 実際に置いてみて, 重なることのないことをチェック
if validate(p, q):
ans += 1
print(ans)
Discussion