
状压模板题,不多述,复习一下而已
code:
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; const int maxn=20; int map[maxn][maxn],num,n,ans,nums; int f[maxn][1<<18]; void dp(){ memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++)f[i][1<<(i-1)]=map[0][i]; nums=(1<<n)-1; for(int i=0;i<=nums;i++)//枚举所有可能的状态; for(int j=1;j<=n;j++) if(i&(1<<(j-1))) //枚举当前状态下到了第j个结点 for(int k=1;k<=n;k++) {//从j之k,找出到k的最优值。 if((i&(1<<(k-1)))==0) //如果第k结点还到,那么到达k,并更新其值。 f[k][i|(1<<(k-1))] =min(f[k][i|(1<<(k-1))],f[j][i]+map[j][k]); } ans=1<<20; for(int i=1;i<=n;i++) ans=min(ans,f[i][nums]+map[i][0]); cout<<ans<<endl; } int main(){ freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); cin>>n; n--; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) cin>>map[i][j]; dp(); return 0; }