吃奶酪
题目
解析
显然易见这就是一道经典的状压DP例题Hamilton的改版,直接改一下就过了
code:
#include<cmath>
#include<cstdio>
#include<cstring>
#define db double
using namespace std;
int n;
inline db min(db x,db y){return x<y?x:y;}
db x[17],y[17],dp[17][131072],d[17][17],ans=10000000;
inline db dis(int X,int Y){return sqrt((x[X]-x[Y])*(x[X]-x[Y])+(y[X]-y[Y])*(y[X]-y[Y]));}
int main()
{
scanf("%d",&n),memset(dp,127,sizeof(dp));
for(int i=1;i<=n;++i)scanf("%lf%lf",&x[i],&y[i]);
for(int i=0;i<=n;++i)for(int j=0;j<=n;++j)d[i][j]=dis(i,j);
dp[0][0]=0,++n;
for(int i=1;i<(1<<n);++i)for(int j=0;j<n;++j)
{
if(!(i&(1<<j)))continue;
if(i==(1<<j)){dp[j][i]=d[0][j];continue;}
for(int k=0;k<n;++k)if(j!=k&&(i&(1<<k)))dp[j][i]=min(dp[j][i],dp[k][i^(1<<j)]+d[j][k]);
}
for(int i=1;i<=n;++i)ans=min(ans,dp[i][(1<<n)-1]);
printf("%.2lf",ans);
return 0;
}