【BZOJ5471】[FJOI2018]邮递员问题(动态规划)

题面

BZOJ

洛谷

给定平面上若干个点,保证这些点在两条平行线上,给定起点终点,求从起点出发,遍历所有点后到达终点的最短路径长度。

题解

不会做,于是点开LOJ,点开除了\(std\)之外唯一过的人的代码,照着打了一遍QwQ......

然后再对着代码YY一遍就有了这篇东西。。。。。。


强制令起点的位置是第\(0\)行(方便而已)。

在第\(0\)行枚举一个\(i\),在第一行枚举一个\(j\)。

设\(f[j][0]\)表示第\(1\)行\([j+1,n_1]\)这些点已经走完,第\(0\)行\([i,n_0]\)已经走完,然后到达终点的最短路。

设\(f[j][1]\)表示第\(1\)行\([j,n_1]\)已经走完,第\(0\)行\([i+1,n_0]\)已经走完,然后达到终点的最短路。

把\(i\)按照从前往后或者从后往前的顺序枚举,到达起点就直接更新答案。

因为从起点出发可以向两个方向走,所以前后都要做一遍\(dp\)。

转移的话就是一堆讨论。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAX 10100
  7. inline int read()
  8. {
  9. int x=0;bool t=false;char ch=getchar();
  10. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  11. if(ch=='-')t=true,ch=getchar();
  12. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  13. return t?-x:x;
  14. }
  15. int n[2],ty[2],pos[2];
  16. double h,tx[2],x[2][MAX],f[MAX][2];
  17. double Dis(int i,int j)
  18. {
  19. double d=fabs(x[0][i]-x[1][j]);
  20. return sqrt(d*d+h*h);
  21. }
  22. double ToEnd(int i,int j)
  23. {
  24. double d=fabs(x[i][j]-tx[1]);
  25. return i==ty[1]?d:sqrt(h*h+d*d);
  26. }
  27. double Calc()
  28. {
  29. double ret=1e18;
  30. sort(&x[0][1],&x[0][n[0]+1]);
  31. sort(&x[1][1],&x[1][n[1]+1]);
  32. for(int i=n[0];i;--i)
  33. {
  34. if(i==n[0])
  35. for(int j=n[1];j;--j)
  36. {
  37. f[j][0]=j==n[1]?ToEnd(0,n[0]):min(f[j+1][1]+Dis(n[0],j+1),Dis(n[0],n[1])+x[1][n[1]]-x[1][j+1]+ToEnd(1,j+1));
  38. f[j][1]=j==n[1]?ToEnd(1,n[1]):f[j+1][1]+x[1][j+1]-x[1][j];
  39. }
  40. else
  41. for(int j=n[1];j;--j)
  42. if(j==n[1])
  43. {
  44. f[j][1]=min(f[j][0]+Dis(i+1,j),Dis(n[0],n[1])+x[0][n[0]]-x[0][i+1]+ToEnd(0,i+1));
  45. f[j][0]+=x[0][i+1]-x[0][i];
  46. }
  47. else
  48. {
  49. f[j][1]=min(f[j][0]+Dis(i+1,j),f[j+1][1]+x[1][j+1]-x[1][j]);
  50. f[j][0]=min(f[j][0]+x[0][i+1]-x[0][i],f[j+1][1]+Dis(i,j+1));
  51. }
  52. ret=min(ret,x[0][i]-x[0][1]+tx[0]-x[0][1]+Dis(i,1)+f[1][1]);
  53. ret=min(ret,fabs(x[0][i]-tx[0])+x[0][i]-x[0][1]+Dis(1,1)+f[1][1]);
  54. if(x[0][i]<=tx[0])
  55. {
  56. ret=min(ret,tx[0]-x[0][1]+Dis(1,1)+f[1][1]);
  57. break;
  58. }
  59. }
  60. return ret;
  61. }
  62. int main()
  63. {
  64. scanf("%d%d%d%d%d%d%lf",&n[0],&n[1],&ty[0],&pos[0],&ty[1],&pos[1],&h);
  65. int r=0;if(ty[0])r=1,swap(n[0],n[1]),ty[0]^=1,ty[1]^=1;
  66. for(int t=0;t<=1;++t)
  67. for(int i=1;i<=n[t^r];++i)
  68. scanf("%lf",&x[t^r][i]);
  69. tx[0]=x[ty[0]][pos[0]];
  70. tx[1]=x[ty[1]][pos[1]];
  71. double ans=Calc();
  72. for(int t=0;t<=1;++t)
  73. for(int i=1;i<=n[t];++i)
  74. x[t][i]=20000-x[t][i];
  75. tx[0]=20000-tx[0];tx[1]=20000-tx[1];
  76. ans=min(ans,Calc());
  77. printf("%.2lf\n",ans);
  78. return 0;
  79. }

【BZOJ5471】[FJOI2018]邮递员问题(动态规划)的更多相关文章

  1. LOJ2522:[FJOI2018]邮递员问题(乱搞)

    传送门 乱搞. 可以发现如果起点在左边界,终点在右边界的时候上下走的点一定是连续的(可能吧) 那么可以设 \(f_{i,j,0/1}\) 表示当前上面到 \(i\),下面到 \(j\),当前在上面/下 ...

  2. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

  3. 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)

    [BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...

  4. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  5. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  6. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  7. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  8. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  9. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

随机推荐

  1. oc之证书

    https://www.cnblogs.com/MrJalen/p/6813309.html iOS推送证书生成pem文件(详细步骤)   1.pem文件概述 pem文件是服务器向苹果服务器做推送时候 ...

  2. mysql之整合ssm多数据源配置

    一,基于SSM框架的多数据源配置 1.创建DynamicDataSourceHolder用于持有当前线程中使用的数据源标识 public class DynamicDataSourceHolder { ...

  3. mybatis之批量插入

    一.导入功能优化 普通for循环,对于导入大量数据时非常耗时.可以通过Mybatis的批量插入功能提高效率.每批次导入的数据不能太多,否则会报错.通过测试发现,每批次200条为宜. 测试结果: 开启事 ...

  4. 多线程系列之十:Future模式

    一,Future模式 假设有一个方法需要花费很长的时间才能获取运行结果.那么,与其一直等待结果,不如先拿一张 提货单.获取提货单并不耗费时间.这里提货单就称为Future角色获取Future角色的线程 ...

  5. 基于redis实现的点赞功能设计思路详解

    点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysq ...

  6. Java 获取当前日期的四种方法

    //1 通过Date类来获取当前时间,通过SimpleDateFormat来设置时间格式 SimpleDateFormat dateFormat = new SimpleDateFormat(&quo ...

  7. 【Java基础】switch语句实现根据数字输出对应星期

    代码: import java.util.Scanner; /* * switch语句格式: * switch(表达式) { * case 值1: * 语句体1; * break; * case 值2 ...

  8. vue图片被加了盗链

    https://www.cnblogs.com/dongcanliang/archive/2017/04/01/6655061.html <meta name="referrer&qu ...

  9. Day 5-4封装.__隐藏属性或者方法

    封装 property 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 在python中用双下划线开头的方式将属性隐藏起来(设置成 ...

  10. centOS 7下无法启动网络(service network start)错误解决办法

    今天在centOS 7下更改完静态ip后发现network服务重启不了,翻遍了网络,尝试了各种方法,终于解决了. 现把各种解决方法归纳整理,希望能让后面的同学少走点歪路... 首先看问题:执行serv ...