rt。
#include <bits/stdc++.h>
using namespace std;
int n;
array<array<int, 25>, 25> dis;
array<array<int, 25>, (1 << 21) + 1> dp;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> dis[i][j];
}
}
for (unsigned int i = 1; i < (1 << n); ++i) {
fill(dp[i].begin(), dp[i].end(), 2e9);
}
dp[1][1] = 0;
for (unsigned int i = 1; i < (1 << n); ++i) {
for (int j = 1; j <= n; ++j) {
if (i & (1 << (j - 1))) {
for (int k = 1; k <= n; ++k) {
if (!(i & (1 << (k - 1)))) {
dp[i | (1 << (k - 1))][k] = min(dp[i | (1 << (k - 1))][k], dp[i][j] + dis[j][k]);
}
}
}
}
}
cout << dp[(1 << n) - 1][n];
return 0;
}
这份代码在开了O2的情况下最大点不到500ms,不开O2最后两个点都超过1200ms。