状压DP,时间复杂度 $O(2^nn^2)$
//acwing91
#include <iostream>
#include <cstring>
#include <cstdio>
const int maxn=20;
int weight[maxn][maxn],f[1<<maxn][maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
scanf("%d",&weight[i][j]);
memset(f,0x3f,sizeof(f));
f[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((i^1>>j)>>k&1)
f[i][j]=std::min(f[i][j],f[i^1<<j][k]+weight[k][j]);
printf("%d",f[(1<<n)-1][n-1]);
return 0;
}