結果
| 問題 |
No.357 品物の並び替え (Middle)
|
| コンテスト | |
| ユーザー |
efunyo
|
| 提出日時 | 2020-03-27 12:41:35 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 130 ms / 5,000 ms |
| コード長 | 1,411 bytes |
| コンパイル時間 | 658 ms |
| コンパイル使用メモリ | 82,092 KB |
| 実行使用メモリ | 76,956 KB |
| 最終ジャッジ日時 | 2025-01-02 08:30:55 |
| 合計ジャッジ時間 | 2,408 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 18 |
ソースコード
#https://yukicoder.me/problems/810
def main():
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**7)
from collections import Counter, deque
#from collections import defaultdict
from itertools import combinations, permutations, accumulate
#from itertools import product
from bisect import bisect_left,bisect_right
import heapq
from math import floor, ceil
#from operator import itemgetter
#inf = 10**17
#mod = 10**9 + 7
N,M = map(int, input().split())
#edge[i]:品物iの後にあると得点
edge = [[] for i in range(N)]
for _ in range(M):
a,b,c = map(int, input().split())
edge[a].append([b,c])
#dp[s]:sは並べ済みの品物
# dp[s]は残りの品物から得られる最大得点
dp = [-1]*(1<<N)
dp[-1] = 0
def solve(s):
if dp[s] >= 0:
return dp[s]
for i in range(N):
if s & (1<<i):
continue
#品物iを並べることで得られる得点
point = 0
for j in range(N):
if s & (1<<j):
for b,c in edge[j]:
if b==i:
point += c
break
dp[s] = max(dp[s], solve(s|(1<<i))+point)
return dp[s]
print(solve(0))
if __name__ == '__main__':
main()
efunyo