点击打开链接

题意:

游戏园里有N个区域,有M条边连接这N个区域,有K个要访问的景点。对于每个景点告诉你这个景点所在的区域,要访问这个景点需要等待一定时间,如果没有FastPass,等待时间有Ti,否则等待时间为FTi,接下来的Ni,表示有Ni个区域可以得到这个景点的FastPass,问从区域1出发,再回到区域1所需要的最少时间。

思路:

状态压缩,dis[i][s1][s2],表示当前走到这个点,s1表示拿到了哪些景点的FastPass,s2表示已经访问了哪几个景点。

但是需要注意的是:当游览过某个景点之后,就认为拿着了这个景点的票了!!!这个优化很重要

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int n,m,k;
 5 int dis[55][55],dp[55][1<<8][1<<8],pos[10],t[10],ft[10],pas[55];
 6 int ans;
 7
 8 void init(){
 9     ans = 0x3f3f3f3f;
10     memset(dp,0x3f,sizeof(dp));
11     memset(dis,0x3f,sizeof(dis));
12     memset(pas,0,sizeof(pas));
13 }
14
15 void floyd(){
16     for(int k=1; k<=n; k++)
17         for(int i=1; i<=n; i++)
18             for(int j=1; j<=n; j++)
19                 dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
20 }
21
22 void solve(){
23     dp[1][0][0] = 0;
24     for(int s1=0; s1<(1<<k); s1++){
25         for(int s2=0; s2<(1<<k); s2++){
26             for(int i=1; i<=n; i++){
27                 int now = dp[i][s1][s2];
28                 if(now==0x3f3f3f3f) continue;
29                 if(s2==(1<<k)-1) ans = min(ans,now+dis[i][1]);
30                 for(int j=0; j<k; j++){
31                     if((s2&(1<<j)) == 0){ // 没走过第j个景点
32                         int& nxt = dp[pos[j]][s1|pas[pos[j]]][s2^(1<<j)]; // 当游览过某个景点之后,就认为拿着了这个景点的票了!!!
33                         int add = dis[i][pos[j]];
34                         if(s1 & (1<<j)) add += ft[j];
35                         else add += t[j];
36                         nxt = min(nxt,now+add);
37                     }
38                 }
39                 for(int j=1; j<=n; j++){  // 中转 通过j得到fastpass
40                     int& nxt = dp[j][s1|pas[j]][s2];
41                     int add = dis[i][j];
42                     nxt = min(nxt,now+add);
43                 }
44             }
45         }
46     }
47 }
48
49 int main(){
50     int T; cin>>T;
51     for(int cas=1; cas<=T; cas++){
52
53         init();
54         cin >> n >> m >> k;
55         for(int i=1; i<=m; i++){
56             int u,v,w; cin>>u>>v>>w;
57             dis[u][v] = w; dis[v][u] = w;
58         }
59         for(int i=0;i<n;i++) dis[i][i]=0;
60         floyd();
61
62         for(int i=0; i<k; i++){
63             cin >> pos[i] >> t[i] >> ft[i];
64             int num; cin>>num;
65             for(int j=0; j<num; j++){
66                 int tmp; cin>>tmp;
67                 pas[tmp] |= (1<<i);
68             }
69         }
70
71         solve();
72
73         cout << "Case #" << cas << ": " << ans << endl;
74
75     }
76 }

转载于:https://www.cnblogs.com/yxg123123/p/6827730.html

hdu 4114 Disney's FastPass 状压dp相关推荐

  1. HDU 4114 Disney's FastPass(状压dp)

    题意就是给你一些点,有的地方有景区,有的地方有某些景点的优先票,拿优先票去景点和不拿的时间不一样.问从地点1出发去所有景点再回来的最短时间. 得把景点,景区进行状压.即dp[i][j][k]代表参观景 ...

  2. 【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd

    这题是hdu 4114... 跟着19的打了打周测,发现个好题 写了写还wa了一发 题目大意: 给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果 ...

  3. HDU - 4856 Tunnels (预处理+状压dp)

    HDU - 4856 Tunnels (预处理+状压dp) [hud链接] [vj链接] 题目 Problem Description Bob is travelling in Xi'an. He f ...

  4. HDU 5691 Sitting in Line 状压dp

    Sitting in Line 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 Description 度度熊是他同时代中最伟大的数学家,一切 ...

  5. HDU 4114 Disney's FastPass

    传送门 状压dp+最短路. 一个无向图,接下来给出一些兴趣点,每个兴趣点被访问时有一定耗时.找一条从起点开始访问所有兴趣点再回到起点耗时最短的路(必须访问所有兴趣点,途中可以经过任意点(经过任意点包括 ...

  6. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

  7. HDU 3001 Travelling (三进制状压dp)

    题意 n(n<=10)n(n个城市,知道每个城市间的旅行费用,但每个城市最多走两遍.问最小花费是多少 . 也就是每个城市可以走两次的tsp问题. 分析 最多走两次,三进制0 1 2可满足,即用三 ...

  8. HDU 4856 Tunnels(BFS+状压DP)

    HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...

  9. hdu 4778 Gems Fight! 状压dp

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

最新文章

  1. python字符串的美化_python字符串格式化
  2. memcached安装、使用
  3. 第1章 1.9计算机网络概述--OSI参考模型和网络安全
  4. Python 33(1) UDP协议 数据报协议 socketsever模块
  5. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
  6. mongodb 教程一
  7. Vue系列vue-router的参数传递的两种方式(五)
  8. python怎么读取csv文件-python如何读取csv数据
  9. 华为设备IS-IS路由控制原理与实验
  10. python 手机号码归属地 软件,Python查询手机号码归属地几种方法
  11. 什么是存储过程?为什么要写存储过程
  12. Redhat克隆及其配置
  13. 秋招内推码汇总第二波 | 阿里、科大讯飞等10家公司内推码
  14. java8中的流(Stream)
  15. C语言双指针——经典题型
  16. 「力扣」第 546 题:移除盒子(很难的动态规划问题)
  17. 就“敏捷软件开发(第二版)”书评答译者
  18. 实际打印纸张的横向设置不起作用的问题
  19. Linux 批量杀掉进程 kill -9
  20. Java程序员进阶必读,最全微服务架构技术点详解来啦

热门文章

  1. 循环结构--for循环
  2. Picasso加载圆角图片
  3. 无限天空服务器,滚动的天空无限钻石无限金币版
  4. 建模实训报告总结_模型实训的心得体会
  5. 南电转债上市价格预测
  6. 【DBA100人】Payso张耀辉:学材料专业出身的他转身做了“码农”
  7. 忍者必须死3 通关 服务器维护,忍者必须死3进不去怎么办 进不去解决方法详解[多图]...
  8. Android 简单的内存管理器
  9. 如何用数学课件制作工具绘制函数图像
  10. python 爬虫http2