状态压缩DP-> 最短Hamilton路径(Acwing)
题意:n个点,求从0~n-1的最短路径(经过每个点一次) n <= 20
分析:用二进制位表示经过了点的状态,枚举所有的状态
constexpr int inf = 0x3f3f3f3f;
void solve(){
int n;
cin >> n;
vector<vector<int>> dist(n, vector<int> (n));
for (auto& x : dist){
for (auto& y : x){
cin >> y;
}
}
vector<vector<int>> dp(1 << n, vector<int> (n, inf));
dp[1][0] = 0;
for (int i = 1; i < (1 << n); ++i){
for (int j = 0; j < n; ++j){
if ((i >> j) & 1){
for (int k = 0; k < n; ++k){
if (k != j && ((i >> k) & 1)){
dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + dist[k][j]);
}
}
}
}
}
cout << dp[(1 << n) - 1][n - 1] << '\n';
}

浙公网安备 33010602011771号