結果
問題 |
No.357 品物の並び替え (Middle)
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:41:16 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 213 ms / 5,000 ms |
コード長 | 1,808 bytes |
コンパイル時間 | 313 ms |
コンパイル使用メモリ | 82,524 KB |
実行使用メモリ | 79,876 KB |
最終ジャッジ日時 | 2025-03-20 18:41:39 |
合計ジャッジ時間 | 2,604 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 18 |
ソースコード
def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]) idx +=1 M = int(input[idx]) idx +=1 score_table = [[0]*N for _ in range(N)] for _ in range(M): a = int(input[idx]) idx +=1 b = int(input[idx]) idx +=1 s = int(input[idx]) idx +=1 score_table[a][b] = s dp = [[-1 for _ in range(N)] for __ in range(1<<N)] # Initialize for i in range(N): dp[1<<i][i] = 0 # Process masks in increasing order of bit count for mask in range(1<<N): # Get current bit count bits = bin(mask).count('1') if bits <1: continue # Check all possible last elements for last in range(N): if not (mask & (1 << last)): continue current_score = dp[mask][last] if current_score == -1: continue # not reached state # Try adding next element for next_node in range(N): if mask & (1 << next_node): continue # already present new_mask = mask | (1 << next_node) # Calculate additional score add = 0 # Check all items in mask (including last) for item in range(N): if mask & (1 << item): add += score_table[item][next_node] new_score = current_score + add if new_score > dp[new_mask][next_node]: dp[new_mask][next_node] = new_score max_score = 0 full_mask = (1 << N) -1 for last in range(N): max_score = max(max_score, dp[full_mask][last]) print(max_score) if __name__ == "__main__": main()