状态压缩DP-> 最短Hamilton路径(Acwing)

题意:n个点,求从0~n-1的最短路径(经过每个点一次) n <= 20

分析:用二进制位表示经过了点的状态,枚举所有的状态

constexpr int inf = 0x3f3f3f3f;
void solve(){
int n;
cin >> n;

vector<vector> dist(n, vector (n));
for (auto& x : dist){
for (auto& y : x){
cin >> y;
}
}

vector<vector> dp(1 << n, vector (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';
}

posted @ 2024-01-16 09:17  _Yxc  阅读(39)  评论(0)    收藏  举报