16_valves.py 960 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/env python3
  2. import sys
  3. from functools import lru_cache
  4. def parse(line):
  5. _, node, _, _, flow, _, _, _, _, nbs = line.split(' ', 9)
  6. return node, int(flow[5:-1]), nbs.rstrip().split(', ')
  7. def open_valves(graph, time, helpers):
  8. @lru_cache(maxsize=None)
  9. def travel(opened, pos, t, helpers):
  10. if t == 0:
  11. return travel(opened, 'AA', time, helpers - 1) if helpers else 0
  12. i, rate, nbs = graph[pos]
  13. mask = 1 << i
  14. best = 0
  15. if rate and opened & mask == 0:
  16. rest = travel(opened | mask, pos, t - 1, helpers)
  17. best = max(best, rate * (t - 1) + rest)
  18. for nb in nbs:
  19. best = max(best, travel(opened, nb, t - 1, helpers))
  20. return best
  21. return travel(0, 'AA', time, helpers)
  22. graph = {valve: (i, rate, nbs)
  23. for i, (valve, rate, nbs) in enumerate(map(parse, sys.stdin))}
  24. print(open_valves(graph, 30, 0))
  25. print(open_valves(graph, 26, 1))