状态DP
状态压缩:走过的路径,从全排列n!量级,忽略次序压缩为2n量级
状态表示:dp[i][j],走过的路径表示为i,且终点为j的路径长度
状态转移:dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+w[k][j]);
(i中包含j、k)
含义,终点为j的最小值=终点(去掉j)为k的最小值+从k到j的路径长度
#include<iostream>
#include<cstring>
using namespace std;
const int N=20,M=1<<N;
int n,w[N][N];
int dp[M][N];
int main(){
cin >> n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin >> w[i][j];
}
}
memset(dp,0x3f,sizeof(dp));
dp[1][0]=0;
for(int i=1;i<1<<n;i++){
for(int j=1;j<n;j++){
if(i>>j&1&&i&1){
for(int k=0;k<n;k++){
if(i>>k&1){
dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+w[k][j]);
}
}
}
}
}
cout << dp[(1<<n)-1][n-1];
return 0;
}