状压DP
添加链接描述
#include<bits/stdc++.h>
#define ll long long
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
using namespace std;
const int M=21,N=1<<M,INF=0x3f;
int a[M][M],dp[N][M];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
memset(dp,INF,sizeof(dp));
dp[1][0]=0;
for(int i=0;i<1<<n;i++)
for(int j=0;j<n;j++)
if(i>>j&1)
for(int k=0;k<n;k++)
if(i>>k&1)
dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+a[k][j]);
cout<<dp[(1<<n)-1][n-1]<<endl;
return 0;
}