[
dp
bit-dp
]
Leetcode 1066 Campus Bikes II
Problem statement
https://leetcode.com/problems/campus-bikes-ii/
Solution
Straightforward bit-dp problem, where dp(mask, i)
means that we have mask
of avaliable bikes and i
is index of current worker we want to distribute bike to. To evaluate value we need to check all non-zero bytes in mask
and check value dist(W[i], B[j]) + dp(mask^(1<<j), i-1)
for them.
Complexity
Time complexity is O(2^m*m)
, because we have at most 2^m
states: even though we have (mask, i)
, in fact number of non-zero bits in mask
minus i
is constant (equal to m-n+1
). And we have O(m)
transactions from one state to others. Space complexity is O(2^m)
.
Code
class Solution:
def assignBikes(self, W, B):
def dist(A, B):
return abs(A[0] - B[0]) + abs(A[1] - B[1])
@lru_cache(None)
def dp(mask, i):
if i == -1: return 0
return min(dist(W[i], B[j]) + dp(mask^(1<<j), i-1) for j in range(m) if (mask>>j) & 1)
n, m = len(W), len(B)
return dp((1<<m)-1, n-1)