题解网上一搜一大坨的,不用复述了吧。

只是觉得网上dp方程没多大问题,但是状态的表示含义模糊。不同于正常哈密顿路径求解,状态表示应当改一下。

首先定义一次移动为从一个点经过若干个点到达另一个点,则$f[S][i]$个人认为应当表示经过若干次移动,每次移动的终点状态记为$1$,由此构成的集合$S$,也就是说,每次移动的中间路过点都不算在内。$i$是最后一次移动的终点。

下面重点解决两个问题:

  • 为什么不记路过点,状态表示仍然是对的?
  • 不记路过点,走过的一条路,必然可以通过相同的一步一步走的路径把每一步都记成$1$。
  • 怎么处理重复走?
  • 重复走点的时候状态不会变,终止节点会变,但由于状态设计的定义,导致如果这样可以产生更新,则一定可以通过更少的移动来更新出来。

但是实际上个人理解仍不透彻,所以具体问什么是对的,怎么证明,还尚不清楚。所以人类又要鸽的本质显现。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define dbg(x) cerr << #x << " = " << x <<endl
  7. using namespace std;
  8. typedef long long ll;
  9. typedef double db;
  10. typedef pair<int,int> pii;
  11. template<typename T>inline T _min(T A,T B){return A<B?A:B;}
  12. template<typename T>inline T _max(T A,T B){return A>B?A:B;}
  13. template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
  14. template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
  15. template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
  16. template<typename T>inline T read(T&x){
  17. x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
  18. while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
  19. }
  20. const int N=;
  21. int f[<<][N],dis[N][N];
  22. int n;
  23.  
  24. int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
  25. while(read(n),n){
  26. memset(f,0x3f,sizeof f);
  27. for(register int i=;i<=n;++i)for(register int j=;j<=n;++j)read(dis[i][j]);
  28. for(register int k=;k<=n;++k)
  29. for(register int i=;i<=n;++i)
  30. for(register int j=;j<=n;++j)
  31. MIN(dis[i][j],dis[i][k]+dis[k][j]);
  32. for(register int i=;i<=n;++i)f[<<i][i]=dis[][i];
  33. for(register int i=;i<<<n+;++i)
  34. for(register int j=;j<=n;++j)if(i&(<<j))
  35. for(register int k=;k<=n;++k)if(k^j)
  36. MIN(f[i|(<<k)][k],f[i][j]+dis[j][k]);
  37. printf("%d\n",f[(<<n+)-][]);
  38. }
  39. return ;
  40. }

【鸽】poj3311 Hie with the Pie[状压DP+Floyd]的更多相关文章

  1. POJ 3311 Hie with the Pie (状压DP)

    dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...

  2. East Central North America 2006 Hie with the Pie /// 状压dp oj22470

    题目大意: 输入n,有n个地方(1~n)需要送pizza pizza点为0点 接下来n+1行每行n+1个值 表示 i 到 j 的路径长度 输出从0点到各点送pizza最后回到0点的最短路(点可重复走) ...

  3. loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd

    LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...

  4. poj3311 Hie with the Pie (状态压缩dp,旅行商)

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3160   Accepted: 1613 ...

  5. 【wikioi】2800 送外卖(状压dp+floyd)

    http://www.wikioi.com/problem/2800/ 本题状压莫名其妙的tle了,(按照hzwer大神打的喂,他1000多ms,我就2000ms了?) (14.8.7更,将getnu ...

  6. POJ 3311 Hie with the Pie(状压DP + Floyd)

    题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...

  7. poj3311 状压dp+floyd

    先floyd预处理一遍dis,枚举所有状态,dp[ i ] [ j ]表示 以  j  为终点的状态 i 使用最小的时间 #include<map> #include<set> ...

  8. hdu_5418_Victor and World(状压DP+Floyd)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题意:给你n个点,和一些边,找一条路径经过全部的点,并回到起点,问最小的花费是多少, 题解:m& ...

  9. POJ3311 Hie with the Pie 【状压dp/TSP问题】

    题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total ...

随机推荐

  1. C#吾日三省吾身

    全局变量与局部变量区别: 全局变量声明完毕后,就算不手动初始化赋值,也是有默认值的; 但是局部变量声明完毕后,如果不给它手动赋值,是无法直接使用这个变量的. 尽量避免少的装箱拆箱: ; .ToStri ...

  2. 系统 --- Linux系统环境搭建

    Linux命令介绍 软硬链接 作用:建立连接文件,linux下的连接文件类似于windows下的快捷方式 分类: 软链接:软链接不占用磁盘空间,源文件删除则软链接失效 硬链接:硬链接只能链接不同文件, ...

  3. python 爬虫小案例

    爬取百度贴吧帖子信息 #!/usr/bin/env python # -*- coding: utf-8 -*- # author: imcati import requests,re,time cl ...

  4. PTA(Advanced Level)1065.A+B and C

    Given three integers A, B and C in [−263,263], you are supposed to tell whether A+B>C. Input Spec ...

  5. PTA(Basic Level)1053.住房空置率

    在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为"可能空置&quo ...

  6. [转帖]Docker常用命令总结

    Docker常用命令总结 http://www.ha97.com/5546.html 发表于: Linux, 互联网, 虚拟化与云计算 | 作者: 博客教主 标签: docker,常用命令,总结 PS ...

  7. MySQL Explain命令详解--表的读取顺序,数据读取操作的类型等

    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的) 不损失精确 ...

  8. 常用的 Git 命令,给你准备好了!

    分支操作: git branch 创建分支 git branch -b 创建并切换到新建的分支上 git checkout 切换分支 git branch 查看分支列表 git branch -v 查 ...

  9. Luogu P5068 [Ynoi2015]我回来了

    题目 Ynoi难得的水题. 首先我们可以\(O(n^2)\)地求出任意两点之间的距离. 然后我们可以\(O(n^3)\)地求出对于任意一个点\(u\),跟它距离\(\le d\)的点的集合. 然后对于 ...

  10. 实现一台Linux电脑连接另一台Linux(SSH实现linux之间的免密码登陆)

    怎么实现一台Linux电脑连接另一台Linux电脑? 首先查看是否安装ssh服务:systemctl status sshd.service 启动服务:systemctl start sshd.ser ...