难度:
Hard
题意:
思路:
2^n*n
,因此这个动态规划的时间复杂度是o(2^n*n^2)
代码:
class Solution {
private int solve(int set, int last, int[][] dist, int[][] cache) {
if (cache[set][last] != -1) {
return cache[set][last];
}
if (set == (1 << dist.length) - 1) {
return cache[set][last] = 0;
}
int ret = 0x3fffffff;
for (int i = 0;i < dist.length;i++) {
if ((set & (1 << i)) == 0) {
ret = Math.min(ret, dist[last][i] + solve(set + (1 << i), i, dist, cache));
}
}
return cache[set][last] = ret;
}
private int[][] calDist(int[][] graph) {
int[][] dist = new int[graph.length][graph.length];
for (int i = 0;i < graph.length;i++) {
for (int j = 0;j < graph.length;j++) {
dist[i][j] = 0x3fffffff;
}
}
for (int i = 0;i < graph.length;i++) {
dist[i][i] = 0;
for (int j = 0;j < graph[i].length;j++) {
dist[i][graph[i][j]] = 1;
}
}
for (int k = 0;k < graph.length;k++) {
for (int i = 0;i < graph.length;i++) {
for (int j = 0;j < graph.length;j++) {
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
return dist;
}
public int shortestPathLength(int[][] graph) {
int[][] cache = new int[1 << graph.length][graph.length];
for (int i = 0;i < (1 << graph.length);i++) {
for (int j = 0;j < graph.length;j++) {
cache[i][j] = -1;
}
}
int[][] dist = calDist(graph);
int ret = 0x3fffffff;
for (int i = 0;i < graph.length;i++) {
ret = Math.min(ret, solve((1 << i), i, dist, cache));
}
return ret;
}
}