题意:m个城市,n个人,让这n个人按固定顺序走遍m个城市。每个城市有一个单人票价pi。每个人在每个城市能获得vij的价值。如果多个人在同一城市,那么会额外获得价值,给出一张n * n价值表,额外价值为任意两个组成队伍的价值和。每个人可以在中途退出,但是退出后不能再回来。问终点后最大价值。

思路:dp[st][i]表示在i城市状态st的最大价值,然后打表打出st的所有子集,每次都往子集转移。

代码:

  1. #include<set>
  2. #include<map>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<cstring>
  8. #include <iostream>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. typedef unsigned long long ull;
  13. const int maxn = 10 + 5;
  14. const int M = maxn * 30;
  15. const ull seed = 131;
  16. const int INF = 0x3f3f3f3f;
  17. const int MOD = 1e4 + 7;
  18. int dp[1 << maxn][maxn];
  19. int p[maxn], v[maxn][maxn], b[maxn][maxn];
  20. int eachother[1 << maxn], one[1 << maxn];
  21. int nex[1 << 10][1 << 10 + 5], cnt[1 << 10];
  22. int n, m;
  23. int main(){
  24. memset(cnt, 0, sizeof(cnt));
  25. for(int i = 0; i < (1 << 10); i++){
  26. for(int j = 0; j <= i; j++){
  27. if((i & j) == j)
  28. nex[i][cnt[i]++] = j;
  29. }
  30. }
  31.  
  32. while(~scanf("%d%d", &n, &m) && n + m){
  33. for(int i = 0; i < m; i++) scanf("%d", &p[i]);
  34. for(int i = 0; i < n; i++)
  35. for(int j = 0; j < m; j++)
  36. scanf("%d", &v[i][j]);
  37. for(int i = 0; i < n; i++)
  38. for(int j = 0; j < n; j++)
  39. scanf("%d", &b[i][j]);
  40.  
  41. memset(eachother, 0, sizeof(eachother));
  42. for(int i = 0; i < (1 << n); i++){
  43. for(int j = 0; j < n; j++){
  44. if(!((1 << j) & i)) continue;
  45. for(int k = j + 1; k < n; k++){
  46. if(!((1 << k) & i)) continue;
  47. eachother[i] += b[j][k];
  48. }
  49. }
  50. }
  51. memset(dp, -INF, sizeof(dp));
  52. for(int i = 0; i < (1 << n); i++){
  53. dp[i][0] = 0;
  54. for(int j = 0; j < n; j++){
  55. if((1 << j) & i) dp[i][0] += v[j][0] - p[0];
  56. }
  57. dp[i][0] += eachother[i];
  58. }
  59. for(int i = 0; i < m - 1; i++){
  60. for(int j = 0; j < (1 << n); j++){
  61. for(int k = 0; k < cnt[j]; k++){
  62. int st = nex[j][k];
  63. int now = dp[j][i];
  64. for(int f = 0; f < n; f++){
  65. if((1 << f) & st) now += v[f][i + 1] - p[i + 1];
  66. }
  67. now += eachother[st];
  68. dp[st][i + 1] = max(dp[st][i + 1], now);
  69. }
  70. }
  71. }
  72.  
  73. int ans = 0;
  74. for(int i = 0; i < (1 << n); i++){
  75. if(ans < dp[i][m - 1]){
  76. ans = dp[i][m - 1];
  77. }
  78. }
  79. if(ans > 0) printf("%d\n", ans);
  80. else printf("STAY HOME\n");
  81. }
  82. return 0;
  83. }

HDU 4049 Tourism Planning(状压DP)题解的更多相关文章

  1. hdu 4049 Tourism Planning [ 状压dp ]

    传送门 Tourism Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  3. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  5. HDU 4272 LianLianKan(状压DP)题解

    题意:一个栈,每次可以选择和栈顶一样的数字,并且和栈顶距离小于6,然后同时消去他们,问能不能把所有的数消去 思路:一个数字最远能消去和他相距9的数,因为中间4个可以被他上面的消去.因为还要判断栈顶有没 ...

  6. HDU 4628 Pieces(状压DP)题解

    题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...

  7. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  8. hdu 3681(bfs+二分+状压dp判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...

  9. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  10. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

随机推荐

  1. 百度文库Word下载器

    最近我妈的文库VIP用完了,但还有很多资源要下载,于是我便在网上找下载工具. 总算找到个完美的!(虽然没界面) 既然没界面,那就自己写一个呗! 原作者 该程序的下载和写入部分由地球守卫者制作 原文链接 ...

  2. libuv中实现tcp服务器

    目录 1.说明 2.libuv的tcp server 3.API简介 3.1.uv_tcp_init 3.2.uv_ip4_addr 3.3.uv_tcp_bind 3.4.uv_listen 3.5 ...

  3. eNSP启动设备AR1失败记一次解决步骤

    eNSP稳定版本下载:   微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...

  4. 广告召回 Query-Ad Matching

    小结: 1.最为基础的召回链路就是要保证召回层的相关性,但是相关性高的广告并不一定具有很高的商业价值,所以开始尝试将一些商业化业务指标作为召回的依据 百度凤巢新一代广告召回系统--"莫比乌斯 ...

  5. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

  6. 线性DP总结(studying

    写在前面 虽然都说线性DP是入门,但我还是今天才开始学 线性DP就是珂以通过线性处理得出答案的一种DP 每一种状态都可以从前面推得,并且推导过程是呈线性的 参考题单(本人现在主要用luogu,所以这些 ...

  7. SpringMVC听课笔记(十三:使用拦截器)

    1.定义一个拦截器: 实现 HandlerInterceptor接口 2. 配置 3.运行流程 4.也可以通过<mvc:mapping>给拦截器设定特定的拦截路径,或者<mvc:ex ...

  8. 项目action:前台传多个dataWrap给后台

    业务描述:当前台需要向后台传递多个dataWrap时,需要给后台action加上一段方法,才可以获取到额外的dataWrap. @Override public List<String> ...

  9. 23.centos 7配置网络

    1.ifconfig:查看网卡信息   如果centos7 最小化安装没有ifconfig这个命令,可以使用yum install net-tools 来安装. centos7 网卡命名规则:  en ...

  10. linux 一分钟安装maven linux

    mkdir maven cd maven/ wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/ ...