提出 #31278376


ソースコード 拡げる

MOD = 10 ** 9 + 7
n = int(input())
a = [list(map(int, input().split())) for i in range(n)]
popcount = [bin(x).count("1") for x in range(1 << n)]
dp = [[0] * (1 << n) for i in range(n + 1)]
# dp[i][j] = 男性 0, ..., i - 1 と女性 j (2 進法) だけで i ペア作る場合の数
dp[0][0] = 1
for i in range(1, n + 1):
    for j in range(1 << n):
        if popcount[j] != i: # ここで popcount を毎回計算すると計算量が悪化するので前計算しておく
            continue # この continue がないと計算量が悪化する
        for k in range(n): # 男性 i - 1 と女性 k をペアにする
            if (j >> k) & 1 == 0 or a[i - 1][k] == 0:
                continue
            dp[i][j] += dp[i - 1][j - (1 << k)]
        dp[i][j] %= MOD
print(dp[n][(1 << n) - 1])

提出情報

提出日時
問題 O - Matching
ユーザ Pro_ktmr
言語 PyPy3 (7.3.0)
得点 100
コード長 818 Byte
結果 AC
実行時間 1596 ms
メモリ 453164 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 17
セット名 テストケース
All 0_00, 0_01, 0_02, 0_03, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12
ケース名 結果 実行時間 メモリ
0_00 AC 65 ms 62020 KiB
0_01 AC 48 ms 61980 KiB
0_02 AC 45 ms 62008 KiB
0_03 AC 1555 ms 452960 KiB
1_00 AC 65 ms 62020 KiB
1_01 AC 46 ms 61928 KiB
1_02 AC 1437 ms 453016 KiB
1_03 AC 1476 ms 453112 KiB
1_04 AC 1520 ms 453164 KiB
1_05 AC 1552 ms 453156 KiB
1_06 AC 1548 ms 453056 KiB
1_07 AC 1552 ms 452804 KiB
1_08 AC 1596 ms 453032 KiB
1_09 AC 1595 ms 452920 KiB
1_10 AC 1590 ms 453108 KiB
1_11 AC 1579 ms 453152 KiB
1_12 AC 1579 ms 453140 KiB