def solve(N, XYZS):
import sys
INF = sys.maxsize # float("inf")
dist = []
for i in range(N):
a, b, c = XYZS[i]
ds = []
dist.append(ds)
for j in range(N):
p, q, r = XYZS[j]
ds.append(abs(p - a) + abs(q - b) + max(0, r - c))
SIZE = 2 ** N
memo = [[INF] * N for _i in range(SIZE)]
memo[-1][0] = 0
for subset in range(SIZE - 2, -1, -1):
for v in range(N):
for u in range(N):
if (subset >> u) & 1 == 0:
mask = 1 << u
memo[subset][v] = min(
memo[subset][v],
memo[subset | mask][u] + dist[v][u]
)
return memo[0][0]
memo[0][0] = 0
for subset in range(1, SIZE):
for v in range(N):
for u in range(N):
mask = 1 << u
if subset & mask:
memo[subset][v] = min(
memo[subset][v],
memo[subset ^ mask][u] + dist[u][v])
return memo[-1][0]