B站视频地址:https://www.bilibili.com/video/BV18G4y1a7d9/?vd_source=a0bea6f5def58dc5711647a825ed97b6
代码
class Solution {
int[][] workers;
int[][] bikes;
public int assignBikes(int[][] workers, int[][] bikes) {
int n = bikes.length;
this.workers = workers;
this.bikes = bikes;
// 当前没有被分配的自行车可以得到的曼哈顿距离最小值数组
int[] dp = new int[1 << n];
// 第二个参数是二进制n个0,
// eg:n = 4 0000
return dfs(0, 0, dp);
}
/**
*
* @param workerIndex, 还没有自行车的工人,也是递归的结束条件,所有的工人都有自行车之后,递归终止
* @param state 表示自行车的状态,虽为十进制的值,但转为2进制更好理解
* @param dp 当前没有被分配的自行车可以得到的曼哈顿距离最小值数组
* @return 当前没有被分配的自行车可以得到的曼哈顿距离最小值
*/
public int dfs(int workerIndex, int state, int[] dp) {
if (workerIndex == workers.length) {
return 0;
}
if (dp[state] != 0) {
return dp[state];
}
int min = Integer.MAX_VALUE;
for (int i = 0; i < bikes.length; i++) {
// 表示第i辆自行车没有被使用
// 二进制数字上第i位为0
if ((state & (1 << i)) == 0) {
min = Math.min(min, distance(workerIndex, i) + dfs(workerIndex + 1, state | (1 << i), dp));
}
}
dp[state] = min;
return min;
}
public int distance(int workerIndex, int bikeIndex) {
return Math.abs(workers[workerIndex][0] - bikes[bikeIndex][0]) + Math.abs(workers[workerIndex][1] - bikes[bikeIndex][1]);
}
}