只放出错的地方罢
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<n;i++)
dp[1<<i][0]=0;
for(int S=1;S<1<<n;S++)
for(int s=S-1;s;s=(s-1)&S){
if((sub[s]|S)!=sub[s])continue;
int sum=0,ss=S^s;
for(int i=0;i<n;i++){
if(!(ss&1<<i))continue;
int minn=inf;
for(int j=0;j<n;j++){
if(!(s&1<<j))continue;
minn=min(minn,dis[i][j]);
}
sum+=minn;
}
for(int i=1;i<n;i++)
if(dp[s][i-1]<inf)
dp[S][i]=min(dp[S][i],dp[s][i-1]+sum*i);
}
int ans=inf;
for(int i=0;i<n;i++)
ans=min(ans,dp[(1<<n)-1][i]);
printf("%d\n",ans);
inf=0x3f3f3f3f 时85pts
inf=0x3f3f3f 时100pts