fork(1) download
  1. import math
  2. from typing import Tuple, List
  3.  
  4. TSection = Tuple[int, int]
  5.  
  6. def solve(tasks: List[int], days: int) -> Tuple[int, List[TSection]]:
  7. n = len(tasks)
  8. d = [[0 for i in range(n)] for j in range(n)]
  9. v = [[(0, []) for i in range(n)] for j in range(n)]
  10.  
  11. def day_value(start: int, end: int) -> int:
  12. if end < start:
  13. return -math.inf
  14. if d[start][end] != 0:
  15. return d[start][end]
  16.  
  17. res = max(tasks[end], day_value(start, end - 1))
  18. d[start][end] = res
  19. return res
  20.  
  21. def best_variant(start: int, days: int) -> Tuple[int, List[TSection]]:
  22. if start >= len(tasks):
  23. return math.inf, []
  24. if v[start][days] != (0, []):
  25. return v[start][days]
  26.  
  27. if days <= 1:
  28. end = len(tasks) - 1
  29. return day_value(start, end), [(start, end)]
  30.  
  31. variants = []
  32. for end in range(start, len(tasks)):
  33. value, descriptions = best_variant(end + 1, days - 1)
  34. new_value = day_value(start, end) + value
  35. new_descriptions = [(start, end)] + descriptions
  36. new_variant = new_value, new_descriptions
  37. variants.append(new_variant)
  38.  
  39. res2 = min(variants)
  40. v[start][days] = res2
  41. print(f'v[{start}, {days}] = {res2}')
  42. return res2
  43.  
  44. res3 = best_variant(0, days)
  45. print(f'd:')
  46. for k in range(n):
  47. print(f'{d[k]}')
  48. print(f'v:')
  49. for k in range(n):
  50. s = list(map(lambda x: x[0], v[k]))
  51. print(f'{s}')
  52. return res3
  53.  
  54.  
  55. def print_solve(tasks: List[int], days: int) -> None:
  56. print(f'Tasks={tasks} Days={days}')
  57. print(f'Solve:')
  58. value, descriptions = solve(tasks, days)
  59. for start, end in descriptions:
  60. section = tasks[start: end + 1]
  61. print(f'Day {section} => max is {max(section)}')
  62. print(f'Total = {value}\n')
  63.  
  64.  
  65. print_solve([2, 2, 2, 4, 1, 1, 1, 3], 5)
Success #stdin #stdout 0.03s 9740KB
stdin
Standard input is empty
stdout
Tasks=[2, 2, 2, 4, 1, 1, 1, 3] Days=5
Solve:
v[3, 2] = (7, [(3, 3), (4, 7)])
v[4, 2] = (4, [(4, 4), (5, 7)])
v[5, 2] = (4, [(5, 5), (6, 7)])
v[6, 2] = (4, [(6, 6), (7, 7)])
v[7, 2] = (inf, [(7, 7)])
v[2, 3] = (8, [(2, 3), (4, 4), (5, 7)])
v[3, 3] = (8, [(3, 3), (4, 4), (5, 7)])
v[4, 3] = (5, [(4, 4), (5, 5), (6, 7)])
v[5, 3] = (5, [(5, 5), (6, 6), (7, 7)])
v[6, 3] = (inf, [(6, 6), (7, 7)])
v[7, 3] = (inf, [(7, 7)])
v[1, 4] = (9, [(1, 3), (4, 4), (5, 5), (6, 7)])
v[2, 4] = (9, [(2, 3), (4, 4), (5, 5), (6, 7)])
v[3, 4] = (9, [(3, 3), (4, 4), (5, 5), (6, 7)])
v[4, 4] = (6, [(4, 4), (5, 5), (6, 6), (7, 7)])
v[5, 4] = (inf, [(5, 5), (6, 6), (7, 7)])
v[6, 4] = (inf, [(6, 6), (7, 7)])
v[7, 4] = (inf, [(7, 7)])
v[0, 5] = (10, [(0, 3), (4, 4), (5, 5), (6, 6), (7, 7)])
d:
[2, 2, 2, 4, 4, 4, 4, 4]
[0, 2, 2, 4, 4, 4, 4, 4]
[0, 0, 2, 4, 4, 4, 4, 4]
[0, 0, 0, 4, 4, 4, 4, 4]
[0, 0, 0, 0, 1, 1, 1, 3]
[0, 0, 0, 0, 0, 1, 1, 3]
[0, 0, 0, 0, 0, 0, 1, 3]
[0, 0, 0, 0, 0, 0, 0, 3]
v:
[0, 0, 0, 0, 0, 10, 0, 0]
[0, 0, 0, 0, 9, 0, 0, 0]
[0, 0, 0, 8, 9, 0, 0, 0]
[0, 0, 7, 8, 9, 0, 0, 0]
[0, 0, 4, 5, 6, 0, 0, 0]
[0, 0, 4, 5, inf, 0, 0, 0]
[0, 0, 4, inf, inf, 0, 0, 0]
[0, 0, inf, inf, inf, 0, 0, 0]
Day [2, 2, 2, 4] => max is 4
Day [1] => max is 1
Day [1] => max is 1
Day [1] => max is 1
Day [3] => max is 3
Total = 10