hlg 2130 状压dp

基本的状压dp 需要注意的是两点之间直线最短 所以不需要进行floyd 

由于把dp的memset放在了初始化0的后面de了好久的bug..

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
using namespace std;
#define eqs 0.000000001
struct node
{
    double x;
    double y;
};
node a[20];
double f[20][20];
double dp[1<<17][20];
int main(){
int t;
scanf("%d",&t);
while(t--)
{
    int n;
    scanf("%d",&n);
    memset(f,0,sizeof(f));
    for(int i=0;i<n;i++)
    {
        scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    for(int i=0;i<n;i++)
    {
        for(int k=0;k<n;k++)
        {
             f[i][k]=f[k][i]=sqrt((a[i].x-a[k].x)*(a[i].x-a[k].x)+(a[i].y-a[k].y)*(a[i].y-a[k].y));

        }
    }
    int l=(1<<n)-1;
    memset(dp,0x7f,sizeof(dp));
    for(int i=0;i<n;i++)
    {
        dp[1<<i][i]=0;
    }

    for(int s=0;s<=l;s++)
    {
        for(int i=0;i<n;i++)
        {
            if((s&(1<<i))==0)
            continue;
            for(int k=0;k<n;k++)
            {
                if((s&(1<<k))!=0)
                    continue;
                dp[s+(1<<k)][k]=min(dp[s+(1<<k)][k],dp[s][i]+f[i][k]);
            }

        }
    }
    double ans=1e300;
    for(int i=0;i<n;i++)
   {
       ans=min(dp[l][i],ans);
   }
   printf("%.2f
",ans);
}
}

  

原文地址:https://www.cnblogs.com/rayrayrainrain/p/5406429.html