原题链接:http://codevs.cn/problem/2800/

题目描述 Description

有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上。n个不同的客户分别在1~n个编号的城市中。送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少。现在已知任意两个城市的直接通路的时间。

输入描述 Input Description

第一行一个正整数n (1<=n<=15)

接下来是一个(n+1)*(n+1)的矩阵,矩阵中的数均为不超过10000的正整数。矩阵的i行j列表示第i-1号城市和j-1号城市之间直接通路的时间。当然城市a到城市b的直接通路时间和城市b到城市a的直接通路时间不一定相同,也就是说道路都是单向的。

输出描述 Output Description

一个正整数表示最少花费的时间

样例输入 Sample Input
  1. 3
  2. 0 1 10 10
  3. 1 0 1 2
  4. 10 1 0 10
  5. 10 2 10 0
样例输出 Sample Output

8

数据范围及提示 Data Size & Hint

1<=n<=15

这道题很容易想到状压dp,首先跑一遍floyd求出各个点之间的最短路,然后dp。

状态是dp[i][j]表示状态为i(二进制,表示是否访问过每个点),在位置j时的最短路。

转移就是:dp[i][j]=min(dp[i-(1<<v)][u]+grid[u][v],dp[i][j]),其中v是当前位置,u是上一个状态的位置。

需要注意的是dp的顺序应该是由含1的个数少的二进制到1的个数高的二进制;由于最开始就在0位置,所以dp[(1<<n)-1][0]不可能被转移到,所以最后的答案应该是ans=min(ans,dp[(1<<n)-1][i]+grid[i][0]),其中0<=i<n。

详见代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<queue>
  5. #include<algorithm>
  6. #include<cstdio>
  7. #include<climits>
  8. #define INF INT_MAX
  9. #define MAX_S 1<<16
  10. #define MAX_N 17
  11. using namespace std;
  12.  
  13. struct node
  14. {
  15. int val,num;
  16. node(int v,int n)
  17. {val=v;num=n;}
  18. node(){}
  19. };
  20.  
  21. node one[MAX_S];
  22. int grid[MAX_N][MAX_N];
  23. int n;
  24. int dp[MAX_S][MAX_N];
  25. int numOfOne(int x)
  26. {
  27. int res=0;
  28. for(int i=0;i<n;i++)
  29. if((x>>i)&1)res++;
  30. return res;
  31. }
  32.  
  33. void floyd()
  34. {
  35. for(int i=0;i<n;i++)
  36. for(int j=0;j<n;j++)
  37. for(int k=0;k<n;k++)
  38. grid[i][j]=min(grid[i][j],grid[i][k]+grid[k][j]);
  39. }
  40.  
  41. bool cmp(node a,node b)
  42. {
  43. return a.num<b.num;
  44. }
  45.  
  46. int main()
  47. {
  48. scanf("%d",&n);
  49. n++;
  50. for(int i=0;i<n;i++)
  51. for(int j=0;j<n;j++)
  52. scanf("%d",&grid[i][j]);
  53. int totS=1<<n;
  54. for(int i=0;i<totS;i++)one[i]=node(i,numOfOne(i));
  55.  
  56. for(int i=0;i<totS;i++)
  57. for(int j=0;j<n;j++)
  58. dp[i][j]=INF;
  59.  
  60. floyd();
  61. sort(one,one+totS,cmp);
  62. dp[1][0]=0;
  63. for(int i=0;i<totS;i++)
  64. {
  65. int s=one[i].val;
  66. for(int v=0;v<n;v++)
  67. {
  68. if(!((s>>v)&1))continue;
  69. int t=s-(1<<v);
  70. int tmp=INF;
  71. for(int u=0;u<n;u++)
  72. {
  73. if((!((t>>u)&1))||dp[t][u]==INF)continue;
  74. tmp=min(tmp,dp[t][u]+grid[u][v]);
  75. }
  76. if(tmp!=INF)
  77. dp[s][v]=tmp;
  78. }
  79. }
  80. int ans=INF;
  81. for(int i=0;i<n;i++)
  82. ans=dp[totS-1][i]==INF?ans:min(ans,dp[totS-1][i]+grid[i][0]);
  83. cout<<ans<<endl;
  84. return 0;
  85. }

CODEVS_2800 送外卖 状态压缩+动态规划的更多相关文章

  1. Codeves 2800 送外卖 状态压缩DP+floyd

    送外卖     题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后 ...

  2. 2800 送外卖[状态压缩dp]

    2800 送外卖  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 有一个送外卖的,他手上有n份订单,他 ...

  3. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

  4. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  5. 状态压缩动态规划(状压DP)详解

    0 引子 不要999,也不要888,只要288,只要288,状压DP带回家.你买不了上当,买不了欺骗.它可以当搜索,也可以卡常数,还可以装B,方式多样,随心搭配,自由多变,一定符合你的口味! 在计算机 ...

  6. poj 3254(状态压缩+动态规划)

    http://poj.org/problem?id=3254 题意:有一个n*m的农场(01矩阵),其中1表示种了草可以放牛,0表示没种草不能放牛,并且如果某个地方放了牛,它的上下左右四个方向都不能放 ...

  7. 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field

    我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...

  8. BZOJ1087 [SCOI2005]互不侵犯King 状态压缩动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1087 题意概括 在n*n的棋盘上面放k个国王,使得他们互相无法攻击,问有多少种摆法. 题解 dp[ ...

  9. BZOJ1076 [SCOI2008]奖励关 概率 状态压缩动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1076 题意概括 有n个东西,k次扔出来.每次等概率扔出其中一个. 你可以拿这个东西,但是有条件,得 ...

随机推荐

  1. HTML5拖放(drag和drog)

    拖放(drag和drog)是HTML5的标准的组成部分,也是种常见的特性,意义为抓起一个元素放入到另外的一个位置,在HTML5中任何元素都可以被拖放,前题是要相关进行设置. 1.设置元素为可拖放,也就 ...

  2. iOS UI 设计

    优设 http://www.uisdc.com Sketch http://www.sketchcn.com

  3. rom bist scripts

    rom bist 的input 有rom_content file .校验rom还坏,主要通过signature比较.signature跟rom content file 一一对应的. rom bis ...

  4. Web框架之Django_06 模型层了解(F查询、Q查询、事务、update和save、only和defer、choice属性、bulk_create)

    摘要: F查询 Q查询 事务 一.F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢?Django 提供 F() 来 ...

  5. 杭电 1503 Advanced Fruits

    Description The company "21st Century Fruits" has specialized in creating new sorts of fru ...

  6. PAT Basic 1033

    1033 旧键盘打字 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 行中分别给出坏掉 ...

  7. LA 4256 DP Salesmen

    d(i, j)表示使前i个数满足要求,而且第i个数值为j的最小改动次数. d(i, j) = min{ d(i-1, k) | k == j | G[j][k] } #include <cstd ...

  8. centos7 安装nodejs 最新版

    笔者在安装时,node为11.0.0版本.这里以11版本为例,以后更新,安装步骤时一致的. 下载node安装包到指定目录 wget https://npm.taobao.org/mirrors/nod ...

  9. springboot elk实时日志搭建

    https://blog.csdn.net/yy756127197/article/details/78873310 基本的上的过程如这篇博客,logback的配置文件和依赖不太一样 具体见源码其中的 ...

  10. 新技术---- MongoDB

    MongoDB 在 CentOS7 上安装 MongoDB-------https://www.linuxidc.com/Linux/2016-06/132675.htm Centos7 安装mong ...