#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <memory.h>
using namespace std;
int dp[1<<20][21];
int g[21][21];
int main() {
ios::sync_with_stdio(false);
memset(dp,0x3f,sizeof(dp));
int n; cin >> n;
for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) cin >> g[i][j];
dp[1][0] = 0;
for (int s = 1; s < (1 << n); ++s) {
for (int j = 0; j < n; ++j) {
if ((s >> j) & 1) {
for (int k = 0; k < n; ++k) {
if ((s >> k) & 1) {
dp[s][j] = min(dp[s][j], dp[(s ^ (1 << j))][k] + g[k][j]);
}
}
}
}
}
cout << dp[(1 << n) - 1][n-1] << endl;
}
ps
C++用vector会超时,需要使用全局变量,把开辟数组的步骤放到load的时候。