Fix 状态压缩DP HDU 3362

原创 2011年01月17日 13:02:00

题意:

给n个点(n<=18),有些点固定了,有些点没固定。每个点都有坐标,目标是把所有点都固定住,一个未固定的点至少要跟两个点相连才算被固定。

题解:

由于n不大,所以可以用二进制位表示该点是否被固定,一遍DP即可。

代码:

int main(int argc, char** argv)

{

    int i,j,m,x,y,sum;

    double l1,l2;

    while(scanf("%d",&n)!=EOF)

    {

        if ((n==0)) break;

        sum=0;

        for(i=1;i<=n;i++)

        {

            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);

            sum+=a[i].c;

        }

        if (sum<=1)

        {

            if (n-sum>=1)

            {printf("No Solution/n");continue;}

            else {printf("0.000000/n");continue;}

        }

 

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++)

                dis[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));

        for(i=0;i<(1<<n);i++) dp[i]=1e100;

        dp[0]=0;

        ql=fl=0;

        for(i=1;i<=n;i++)

            if (a[i].c==0)

                qq[++ql]=i;

            else fq[++fl]=i;

       // if ((fl<=1)&&(ql>=1)) {printf("No Solution/n");continue;}

       for(i=0;i<(1<<ql);i++)

        {

            for(j=1;j<=ql;j++)

                {

                    if ( (i&(1<<(j-1))) ) continue;

                    l1=l2=1e100;

                    for(int k=1;k<=ql;k++)

                        if ((1<<(k-1))&i)

                        {

                            if (dis[qq[j]][qq[k]]<l1)

                            {

                                l2=l1;

                                l1=dis[qq[j]][qq[k]];

                            }

                            else

                                if (dis[qq[j]][qq[k]]<l2)

                                {

                                    l2=dis[qq[j]][qq[k]];

                                }

                        }

                    for(int k=1;k<=fl;k++)               

                        {

                            if (dis[qq[j]][fq[k]]<l1)

                            {

                                l2=l1;

                                l1=dis[qq[j]][fq[k]];

                            }

                            else

                                if (dis[qq[j]][fq[k]]<l2)

                                {

                                    l2=dis[qq[j]][fq[k]];

                                }

                        }

                    dp[i|(1<<(j-1))]=min(dp[i|(1<<j-1)],dp[i]+l1+l2);

            }

        }

        printf("%.6lf/n",dp[(1<<ql)-1]);

 

    }

    return 0;

}

HDU 3362 Fix (状态压缩DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3362 题目大意:给出n(n 思路:n比较小可用状压DP,从所给的起始状态开始DP,...
  • ACMWONDER
  • ACMWONDER
  • 2015年05月29日 19:13
  • 383

hdu 3920之状态压缩dp

Clear All of Them I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Ot...
  • xingyeyongheng
  • xingyeyongheng
  • 2014年04月02日 20:38
  • 1017

状态压缩DP总结(谨记大牛总结)

状态压缩DP总结【POJ3254】【POJ1185】【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】 分类: 动态规划 201...
  • u010296826
  • u010296826
  • 2014年07月26日 15:37
  • 521

状态压缩DP习题集

1.每一行用一个二进制数表示, 有些二进制数是题目中不合法的状态,我们可以预处理出一行合法状态,放在一个数组里面,在递推的过程中复杂度就会大大降低。 POJ 3254        Corn F...
  • yew1eb
  • yew1eb
  • 2014年08月03日 01:40
  • 1591

HDU 3362 (状态压缩DP)

http://acm.hdu.edu.cn/showproblem.php?pid=3362   题意:题目给出n(n   由于n很小,而且固定点的顺序没有限制,所以需要用状...
  • Night__elf
  • Night__elf
  • 2012年12月26日 15:26
  • 324

HDU 3362 Fix(状压DP)

Fix Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...
  • u013967323
  • u013967323
  • 2015年08月17日 12:24
  • 524

状态压缩dp总结 长期更新

状压dp本人做的题目真的不太多...至今还未理解到其中的精髓.所以一下的思路 描述中有存在不当的地方希望能够指出.另外,有些地方说的比较复杂,因为本弱鸡 对这些东西不是很理解.....多写点有助于理解...
  • HowardEmily
  • HowardEmily
  • 2017年07月22日 10:46
  • 265

hdu1074之状态压缩dp

Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...
  • xingyeyongheng
  • xingyeyongheng
  • 2014年03月21日 20:34
  • 4366

状态压缩DP 小结

好久没更新博客了~ 最近学了一下状压DP的内容,感觉对状态压缩有一点了解,不过有时候做题的时候总感觉有些吃力。今天做了2道TSP的题,虽然知道套路,但是对细节处理做的还是很不好,主要原因就是因为我对...
  • sinat_34336698
  • sinat_34336698
  • 2016年08月06日 16:11
  • 625

HDU 4649 Professor Tian(反状态压缩dp,概率)

题目大意 初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一个操作符,&,|,^ 且每个数字出现的概率是pi 如果某个数字出现了,那么就和前面的数字用它的操作符进行...
  • shuangde800
  • shuangde800
  • 2013年08月07日 14:20
  • 1204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fix 状态压缩DP HDU 3362
举报原因:
原因补充:

(最多只允许输入30个字)