状压dp(位运算应用)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
int map[30][30];
int dp[1<<21][21];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
}
}
memset(dp,0x3f,sizeof dp);
dp[1][0]=0;
for(int i=1;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
if(!(1&(i>>j))) continue;
for(int k=0;k<n;k++)
{
if((1&(i>>k)))
dp[i][j]=min(dp[i][j],dp[i^1<<j][k]+map[k][j]);
}
}
}
cout<<dp[(1<<n)-1][n-1]<<endl;
}