传送门

参考资料:

  [1]:算法竞赛入门经典:第九章 DAG上的动态规划

题意:

  Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过;

  其中 M1 辆列车从 1 号站台驶向 n 号站台,M2 辆列车从 n 号站台驶向 1 号地铁;

  (单程线,M1 辆列车到达 n 号站台后不会回返,同理 M2)

  特工 Maria 要在 T 时刻到达 n 号站台与特务会面,但为了保证安全,在会面前尽量呆在行进的列车中;

  现给出你这 M1+M2 辆列车的发车时刻;

  问如何换乘列车使得特工 Maria 能在 T 时刻前到达 n 号站台,并且在换乘期间在站台的停留时间最短;

  如果可以在规定时间到达 n 站台,输出在站台停留的最短时间,反之,输出 "impossible";

题解:

  看完书上的解释后,感觉,不像是DAG上的动态规划,倒有点像背包的味道;

  1. int n,t;
  2. int m1,m2;
  3. int f[maxn];///前m1辆列车的发车时刻
  4. int e[maxn];///后m2辆列车的发车时刻
  5. int c[maxn];///c[i]:车站i到车站i+1的时间花费
  6. /**
  7. (i,j):i时刻在车站j
  8. dp[i][j]:从(i,j)->(t,n)所需等待的最少时间
  9. */
  10. int dp[maxn][];
  11. /**
  12. hasTrain[i][j][0]=true:i时刻在车站j有到j+1的火车
  13. hasTrain[i][j][1]=true:i时刻在车站j有到j-1的火车
  14. */
  15. bool hasTrain[maxn][][];

  最关键的便是dp[ i ][ j ]的定义;

  之所以定义成二维的,是因为决策受当前时间和所处车站的影响,有两个影响因素;

  定义好后,便是找状态转移方程了;

  首先预处理出 hasTrain 数组:

  1. void Init()///预处理hasTrain
  2. {
  3. mem(hasTrain,false);
  4. for(int i=;i <= m1;++i)
  5. {
  6. int cnt=f[i];
  7. hasTrain[cnt][][]=true;
  8. for(int j=;j <= n;++j)
  9. {
  10. cnt += c[j-];
  11. hasTrain[cnt][j][]=true;
  12. }
  13. }
  14. for(int i=;i <= m2;++i)
  15. {
  16. int cnt=e[i];
  17. hasTrain[cnt][n][]=true;
  18. for(int j=n-;j >= ;--j)
  19. {
  20. cnt += c[j];
  21. hasTrain[cnt][j][]=true;
  22. }
  23. }
  24. }

预处理hasTrain[]

  令dp[t][n]=0,dp[t][1,2,...,n-1]=INF;

  按照时间逆序遍历,对于状态 dp[ i ][ j ]:

  ①等一分钟,下一分钟从车站 j 出发到达(t , n);

  ②搭乘往右开的列车;

  ③搭乘往左开的列车;

  

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. #define mem(a,b) memset(a,b,sizeof(a))
  5. const int maxn=+;
  6.  
  7. int n,t;
  8. int m1,m2;
  9. int f[maxn];///前m1辆列车的发车时刻
  10. int e[maxn];///后m2辆列车的发车时刻
  11. int c[maxn];///c[i]:车站i到车站i+1的时间花费
  12. /**
  13. (i,j):i时刻在车站j
  14. dp[i][j]:从(i,j)->(t,n)所需等待的最少时间
  15. */
  16. int dp[maxn][];
  17. /**
  18. hasTrain[i][j][0]=true:i时刻在车站j有到j+1的火车
  19. hasTrain[i][j][1]=true:i时刻在车站j有到j-1的火车
  20. */
  21. bool hasTrain[maxn][][];
  22.  
  23. void Init()///预处理hasTrain
  24. {
  25. mem(hasTrain,false);
  26. for(int i=;i <= m1;++i)
  27. {
  28. int cnt=f[i];
  29. hasTrain[cnt][][]=true;
  30. for(int j=;j <= n;++j)
  31. {
  32. cnt += c[j-];
  33. hasTrain[cnt][j][]=true;
  34. }
  35. }
  36. for(int i=;i <= m2;++i)
  37. {
  38. int cnt=e[i];
  39. hasTrain[cnt][n][]=true;
  40. for(int j=n-;j >= ;--j)
  41. {
  42. cnt += c[j];
  43. hasTrain[cnt][j][]=true;
  44. }
  45. }
  46. }
  47. void Solve()
  48. {
  49. Init();
  50. for(int i=;i < n;++i)
  51. dp[t][i]=INF;
  52. dp[t][n]=;
  53. for(int i=t-;i >= ;--i)
  54. {
  55. for(int j=;j <= n;++j)
  56. {
  57. dp[i][j]=dp[i+][j]+;
  58. if(j < n && hasTrain[i][j][] && i+c[j] <= t)
  59. dp[i][j]=min(dp[i][j],dp[i+c[j]][j+]);
  60. if(j > && hasTrain[i][j][] && i+c[j-] <= t)
  61. dp[i][j]=min(dp[i][j],dp[i+c[j-]][j-]);
  62. }
  63. }
  64. if(dp[][] >= INF)
  65. puts("impossible");
  66. else
  67. printf("%d\n",dp[][]);
  68. }
  69. int main()
  70. {
  71. int kase=;
  72. while(~scanf("%d",&n) && n)
  73. {
  74. scanf("%d",&t);
  75. for(int i=;i < n;++i)
  76. scanf("%d",c+i);
  77. scanf("%d",&m1);
  78. for(int i=;i <= m1;++i)
  79. scanf("%d",f+i);
  80. scanf("%d",&m2);
  81. for(int i=;i <= m2;++i)
  82. scanf("%d",e+i);
  83.  
  84. printf("Case Number %d: ",++kase);
  85. Solve();
  86. }
  87. return ;
  88. }

UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)的更多相关文章

  1. UVA - 1025 A Spy in the Metro[DP DAG]

    UVA - 1025 A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especia ...

  2. UVA 1025 -- A Spy in the Metro (DP)

     UVA 1025 -- A Spy in the Metro  题意:  一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, ...

  3. uva 1025 A Spy in the Metro 解题报告

    A Spy in the Metro Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebug Secr ...

  4. UVA 437 The Tower of Babylon(DAG上的动态规划)

    题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...

  5. UVA 1025 A Spy in the Metro 【DAG上DP/逆推/三维标记数组+二维状态数组】

    Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After s ...

  6. DAG的动态规划 (UVA 1025 A Spy in the Metro)

    第一遍,刘汝佳提示+题解:回头再看!!! POINT: dp[time][sta]; 在time时刻在车站sta还需要最少等待多长时间: 终点的状态很确定必然是的 dp[T][N] = 0 ---即在 ...

  7. UVa 1025 A Spy in the Metro(动态规划)

    传送门 Description Secret agent Maria was sent to Algorithms City to carry out an especially dangerous ...

  8. uva 1025 A Spy int the Metro

    https://vjudge.net/problem/UVA-1025 看见spy忍俊不禁的想起省赛时不知道spy啥意思 ( >_< f[i][j]表示i时刻处于j站所需的最少等待时间,有 ...

  9. UVa 1025 A Spy in the Metro

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913 预处理出每个时间.每个车站是否有火车 为了方便判断是否可行,倒推处理 ...

随机推荐

  1. 【水滴石穿】rn_statusbar

    先放项目地址https://github.com/hezhii/rn_statusbar 来看一下效果 咩有感觉很怎么样,看代码 根入口文件 //index.js //看代码我们知道入口是app.js ...

  2. IDEA 运行maven项目配置

  3. CSS面试题总结2(转)

    1.你最喜欢的图片替换方法是什么,你如何选择使用. 图像替代,就是像我们在平时将文本添加到文本中,然后通过css隐藏文本并在它的位置上显示一个背景图片,这样,搜索引擎仍然可以搜到HTML文本,即使我们 ...

  4. MVC设计之MVC设计模式(介绍)

    mvc介绍; 首先先引用一个百度百科的介绍: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用 ...

  5. xib搭建scrollView无法滑动的问题

    最近给xib中的scrollView添加contentView的时候,view的约束总是参照莫名其妙的东西,不是frameLayout就是safeArea 因为之前都是默认以superView为参照系 ...

  6. C++运行时类型识别

    通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型. 通过下面两个操作符提供 RTTI: 1. typeid 操作符,返回指针或引用所指对象的实际类 ...

  7. GIAC2019 演讲精选 | 面向未来的黑科技——UI2CODE闲鱼基于图片生成跨端代码

    一直以来, 如何从‘视觉稿’精确的还原出 对应的UI侧代码 一直是端侧开发同学工作里消耗比较大的部分,一方面这部分的工作 比较确定缺少技术深度,另一方面视觉设计师也需要投入大量的走查时间,有大量无谓的 ...

  8. dva框架简单描述使用

    首先传统的create-router-app脚手架生成的脚手架我们写仓库的时候用reducers进行调用还有thunk进行异步操作的时候,需要多层函数进行调用,这样会让我们代码进行维护的时候变得麻烦, ...

  9. 在沙箱中IE不能上网的解决方法

    近期在解决一个问题,在我们的沙箱中IE不能上网 现象:     IE不能上网.输入www.baidu.com 提示:不能查找到DNS.也不能ping 通     其它浏览器上网没有问题(SG浏览器,C ...

  10. Gym-101623H_High Score

    题意:t组数据,每组数据有abcd四个数,其中d可以加到abc任意一个数上(d可以拆分),求公式a^2 + b^2 + c^2 + 7 * min(a,b,c)的最大值. 题解:首先明确一点,平方的增 ...