首页 > 其他 > 详细

hlg 2130 状压dp

时间:2016-04-19 00:20:50      阅读:127      评论:0      收藏:0      [点我收藏+]

基本的状压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\n",ans);
}
}

  

hlg 2130 状压dp

原文:http://www.cnblogs.com/rayrayrainrain/p/5406429.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!