Skip to content

Commit 15e7898

Browse files
committed
Kattis Collecting beepers
1 parent 05729fe commit 15e7898

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
2+
from functools import cache
3+
4+
@cache
5+
def dist(A: tuple[float], B: tuple[float]) -> float:
6+
return sum(
7+
abs(x - y) for x, y in zip(A, B)
8+
)
9+
10+
for _ in range(int(input())):
11+
X, Y = map(int, input().split())
12+
start = tuple(map(int, input().split()))
13+
beepers = [
14+
(*map(int, input().split()), ) for _ in range(int(input()))
15+
]
16+
totalSubsets = 1 << len(beepers) # 2 ** n sets
17+
18+
# dp[j][mask] = Minimal cost to be at j,
19+
# while having visited beepers in mask
20+
dp = [[float("inf") for _ in range(totalSubsets)] for _ in range(len(beepers))]
21+
for mask in range(totalSubsets):
22+
for j in range(len(beepers)):
23+
if mask == (1 << j):
24+
dp[j][mask] = dist(start, beepers[j])
25+
elif mask & (1 << j):
26+
dp[j][mask] = min(
27+
dist(
28+
beepers[j], beepers[k]
29+
) + dp[k][mask & ~(1 << j)] for k in range(len(beepers))
30+
if (mask & ~(1 << j)) & (1 << k)
31+
)
32+
33+
res = min(
34+
dp[j][totalSubsets - 1] + dist(beepers[j], start) for j in range(len(beepers))
35+
)
36+
37+
38+
print(res)
39+
40+

0 commit comments

Comments
 (0)