import math from typing import Tuple, List TSection = Tuple[int, int] def solve(tasks: List[int], days: int) -> Tuple[int, List[TSection]]: n = len(tasks) d = [[0 for i in range(n)] for j in range(n)] v = [[(0, []) for i in range(n)] for j in range(n)] def day_value(start: int, end: int) -> int: if end < start: return -math.inf if d[start][end] != 0: return d[start][end] res = max(tasks[end], day_value(start, end - 1)) d[start][end] = res return res def best_variant(start: int, days: int) -> Tuple[int, List[TSection]]: if start >= len(tasks): return math.inf, [] if v[start][days] != (0, []): return v[start][days] if days <= 1: end = len(tasks) - 1 return day_value(start, end), [(start, end)] variants = [] for end in range(start, len(tasks)): value, descriptions = best_variant(end + 1, days - 1) new_value = day_value(start, end) + value new_descriptions = [(start, end)] + descriptions new_variant = new_value, new_descriptions variants.append(new_variant) res2 = min(variants) v[start][days] = res2 print(f'v[{start}, {days}] = {res2}') return res2 res3 = best_variant(0, days) print(f'd:') for k in range(n): print(f'{d[k]}') print(f'v:') for k in range(n): s = list(map(lambda x: x[0], v[k])) print(f'{s}') return res3 def print_solve(tasks: List[int], days: int) -> None: print(f'Tasks={tasks} Days={days}') print(f'Solve:') value, descriptions = solve(tasks, days) for start, end in descriptions: section = tasks[start: end + 1] print(f'Day {section} => max is {max(section)}') print(f'Total = {value}\n') print_solve([2, 2, 2, 4, 1, 1, 1, 3], 5)
Standard input is empty
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