Basic: Backtracking + pruning
1 class Solution { 2 int minDis = Integer.MAX_VALUE; 3 4 public int assignBikes(int[][] workers, int[][] bikes) { 5 dfs(workers, bikes, new boolean[bikes.length], 0, 0); 6 return minDis; 7 } 8 9 public void dfs(int[][] workers, int[][] bikes, boolean[] visited, int pos, int distance) { 10 if (pos == workers.length) { 11 minDis = Math.min(minDis, distance); 12 return; 13 } 14 if (distance > minDis) return; 15 for (int i = 0; i < visited.length; i ++) { 16 if (visited[i]) continue; 17 visited[i] = true; 18 dfs(workers, bikes, visited, pos + 1, distance + manhattanDis(workers[pos], bikes[i])); 19 visited[i] = false; 20 } 21 } 22 23 public int manhattanDis(int[] worker, int[] bike) { 24 return Math.abs(worker[0] - bike[0]) + Math.abs(worker[1] - bike[1]); 25 } 26 }
DP: refer to https://leetcode.com/problems/campus-bikes-ii/discuss/305218/DFS-+-Pruning-And-DP-Solution
state : dp[i][s] = the min distance for first i workers to build the state s ,transit: dp[i][s] = min(dp[i][s], dp[i - 1][prev] + dis(worker[i -1], bike[j)) | 0 < j <m, prev = s ^ (1 << j)init:dp[0][0] = 0;result: dp[n][s] s should have n bit
1 public int assignBikes(int[][] workers, int[][] bikes) { 2 int n = workers.length; 3 int m = bikes.length; 4 int[][] dp = new int[n + 1][1 << m]; 5 for (int[] d : dp) { 6 Arrays.fill(d, Integer.MAX_VALUE / 2); 7 } 8 dp[0][0] = 0; 9 int min = Integer.MAX_VALUE; 10 for (int i = 1; i <= n; i++) { 11 for (int s = 1; s < (1 << m); s++) { 12 for (int j = 0; j < m; j++) { 13 if ((s & (1 << j)) == 0) { // s is current state after the operation of taking bike at j, so s at j should be 1 already 14 continue; 15 } 16 int prev = s ^ (1 << j); // previously s at j should be 0 17 dp[i][s] = Math.min(dp[i - 1][prev] + dis(workers[i - 1], bikes[j]), dp[i][s]) ; 18 if (i == n) { 19 min = Math.min(min, dp[i][s]); 20 } 21 } 22 } 23 } 24 return min; 25 } 26 27 public int dis(int[] p1, int[] p2) { 28 return Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]); 29 }
转载于:https://www.cnblogs.com/EdwardLiu/p/11617637.html
相关资源:JAVA上百实例源码以及开源项目