結果
| 問題 |
No.357 品物の並び替え (Middle)
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 20:15:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 222 ms / 5,000 ms |
| コード長 | 1,808 bytes |
| コンパイル時間 | 170 ms |
| コンパイル使用メモリ | 82,224 KB |
| 実行使用メモリ | 80,008 KB |
| 最終ジャッジ日時 | 2025-03-20 20:16:37 |
| 合計ジャッジ時間 | 2,448 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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()
lam6er