結果
| 問題 |
No.943 取り調べ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-10-23 15:48:32 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 672 ms / 1,206 ms |
| コード長 | 1,073 bytes |
| コンパイル時間 | 209 ms |
| コンパイル使用メモリ | 82,332 KB |
| 実行使用メモリ | 78,132 KB |
| 最終ジャッジ日時 | 2024-07-02 07:42:54 |
| 合計ジャッジ時間 | 4,883 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
N = int(input())
X = [list(map(int,input().split())) for i in range(N)]
for i in range(N):
val = 0
rate = 1
for j in range(N):
if X[i][j] == 1:
val += rate
rate <<= 1
X[i] = val
A = list(map(int,input().split()))
INF = 1 << 60
dp = [INF] * (1 << N)
dp[0] = 0
for status in range(1 << N):
for target in range(N): # 次に自白させたい人
if (status >> target) & 1:
continue # 自白済み。
# print(bin(status)[2:].zfill(3),"から",bin(1 << target)[2:].zfill(3),"を自白させたい")
# X[target]が1の人が自白済みでなければコストが掛かる
cost = dp[status]
next_status = status | (1 << target)
for i in range(N):
if (X[target] >> i) & 1 and (status >> i) & 1 == 0:# 信頼している人が自白していない
# iの人が自白したと嘘をつく
# print(i,"が自白したと嘘をつく",A[i])
next_status |= (1 << i)
cost += A[i]
# print("cost",cost,"が発生")
if dp[next_status] > cost:
dp[next_status] = cost
print(dp[-1])