nikunjsoni

1066

Jun 8th, 2021 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     int assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
  4.         int wlen = workers.size(), blen = bikes.size();
  5.         vector<vector<int>> memo(wlen, vector(1<<blen, -1));
  6.         return solve(workers, bikes, wlen, blen, memo, 0, 0);
  7.     }
  8.    
  9.     int solve(vector<vector<int>>& workers, vector<vector<int>>& bikes, int wlen, int blen, vector<vector<int>>& memo, int pos, int mask){
  10.         if(pos == wlen) return 0;
  11.         if(memo[pos][mask] != -1) return memo[pos][mask];
  12.         int ans = INT_MAX;
  13.         for(int i=0; i<blen; i++){
  14.             if((mask & (1<<i)) == 0){
  15.                ans = min(ans, solve(workers, bikes, wlen, blen, memo, pos+1, mask|(1<<i))+getDist(workers[pos], bikes[i]));
  16.             }
  17.         }
  18.         return memo[pos][mask] = ans;
  19.     }
  20.    
  21.     int getDist(vector<int> &a, vector<int> &b){
  22.         return int(abs(a[0]-b[0])+abs(a[1]-b[1]));
  23.     }
  24. };
  25.  
  26. -----------------------
  27.  
  28. class Solution {
  29. public:
  30.     int assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
  31.         int wlen = workers.size(), blen = bikes.size();
  32.         vector<int> memo(1<<blen, -1);
  33.         return solve(workers, bikes, wlen, blen, memo, 0, 0);
  34.     }
  35.    
  36.     int solve(vector<vector<int>>& workers, vector<vector<int>>& bikes, int wlen, int blen, vector<int>& memo, int pos, int mask){
  37.         // Base case when we have assigned bikes to all workers.
  38.         if(pos == wlen) return 0;
  39.        
  40.         // Check if the state is already visited.
  41.         if(memo[mask] != -1) return memo[mask];
  42.        
  43.         int ans = INT_MAX;
  44.         // Check if current bike is free, if yes, assign it to current worker, set bit and move on.
  45.         for(int i=0; i<blen; i++){
  46.             if((mask & (1<<i)) == 0){
  47.                ans = min(ans, solve(workers, bikes, wlen, blen, memo, pos+1, mask|(1<<i))+getDist(workers[pos], bikes[i]));
  48.             }
  49.         }
  50.        
  51.         // Update cache and return.
  52.         return memo[mask] = ans;
  53.     }
  54.    
  55.     int getDist(vector<int> &a, vector<int> &b){
  56.         return int(abs(a[0]-b[0])+abs(a[1]-b[1]));
  57.     }
  58. };
Add Comment
Please, Sign In to add comment