classSolution{public:intassignBikes(vector<vector<int>>&workers,vector<vector<int>>&bikes){// dp[i] := min dist to assign bikes j (bitmask)dp.resize(1<<bikes.size());returnassignBikes(workers,bikes,0,0);}private:vector<int>dp;intassignBikes(constvector<vector<int>>&workers,constvector<vector<int>>&bikes,ints,intbikeUsed){if(s==workers.size())return0;if(dp[bikeUsed])returndp[bikeUsed];intans=INT_MAX;for(inti=0;i<bikes.size();++i){if(bikeUsed>>i&1)continue;ans=min(ans,dist(workers[s],bikes[i])+assignBikes(workers,bikes,s+1,bikeUsed|1<<i));}returndp[bikeUsed]=ans;}intdist(constvector<int>&p1,constvector<int>&p2){returnabs(p1[0]-p2[0])+abs(p1[1]-p2[1]);}};
classSolution{publicintassignBikes(int[][]workers,int[][]bikes){// dp[i] := min dist to assign bikes j (bitmask)dp=newint[1<<bikes.length];returnassignBikes(workers,bikes,0,0);}privateint[]dp;privateintassignBikes(int[][]workers,int[][]bikes,ints,intbikeUsed){if(s==workers.length)return0;if(dp[bikeUsed]>0)returndp[bikeUsed];intans=Integer.MAX_VALUE;for(inti=0;i<bikes.length;++i){if((bikeUsed>>i&1)==1)continue;ans=Math.min(ans,dist(workers[s],bikes[i])+assignBikes(workers,bikes,s+1,bikeUsed|1<<i));}returndp[bikeUsed]=ans;}privateintdist(int[]p1,int[]p2){returnMath.abs(p1[0]-p2[0])+Math.abs(p1[1]-p2[1]);}}
classSolution:defassignBikes(self,workers:List[List[int]],bikes:List[List[int]])->int:defdist(p1:List[int],p2:List[int])->int:returnabs(p1[0]-p2[0])+abs(p1[1]-p2[1])# Dp(s, j) := min dist to assign bikes j (bitmask) to workers[s:]@functools.lru_cache(None)defdp(s:int,bikeUsed:int)->int:ifs==len(workers):return0ans=math.inffori,bikeinenumerate(bikes):ifbikeUsed>>i&1:continueans=min(ans,dist(workers[s],bike)+dp(s+1,bikeUsed|1<<i))returnansreturndp(0,0)