题目描述每一个要上天堂的人都要经历一番考验,当然包括小X,小X开始了他进入天堂的奇异之旅。地狱有18层,天堂竟然和地狱一样,也有很多很多层,天堂共有N层。从下到上依次是第1,2,3,…,N层,天堂的每一层都是一个延伸无限远的地板,在地板上人可以任意走动,层与层之间是平行关系,每一层的地板都是由人不能穿过的物质构成,幸好每一层地板上有且仅有1个人可以通过的洞口。我们可以把小X和洞口,还有下面提到的气球店都看成点,坐标是二维的。小X开始在第31层的(0,0).小X的重量为M,第i层与第i+1层之间的特殊气体能浮起的重量为Wi ,每一层的地面上散落了若干个气球店,多个气球店可以在同一点,每个气球可以浮起的重量是1,去一个气球店一次只能领取一个气球,不能连续在一个气球店领取气球,当然你可以在两个气球店之间来回跑,每个气球店供应的气球都是无限多的。第i层的气球只能在第i层进入第i+1层时使用,当小X在第i层,只有站到了第i+1层洞口的位置(在其它位置不会浮起),并且自身的重量小于等于气球和特殊气体浮起重量的总和,才可以进入第i+1层。小X想知道他要到达第N层走过的长度最少是多少?题目保证有解。输入文件第1行: 三个正整数N,M,Q(Q表示气球店)第2行: 共2*(N-1)个整数,每两个数描述1个洞口坐标,第i对xi,yi表示第i+1层的洞口位置(xi,yi)。第3行: 共N-1个整数,第i个数为Wi。往后Q行,每行三个整数x,y,z , 表示第Z层有一个气球店,坐标为(x,y)输出文件1个实数L,保留两位小数,表示小X最少要走的长度。样例输入3 10 40 0 1 29 00 1 12 3 10 1 21 1 2样例输出13.00注释【样例解释】在第一层从(0,0)出发到(0,1)取得1个气球并返回(0,0)即可到达第二层。长度:2.00在第二层,从(0,0)到(0,1)领取气球,再到(1,1)领取气球,两个点来回跑,第5次到达(1,1)时恰好气球数达到10,走到(1,2)即可到达第3层终点。长度:11.00总长度:13.00【数据范围】2<=N<=100每层的气球店数目不超过50。0<=M<=100, 0<=Wi<=100坐标-3000<=x,y<=3000

可以看出,每一层与其它层是互不影响的。对于第x层,共有number[x]个气球店,气体浮力为air[x],即需领m-air[x]个气球f[i,j]表示在第i个气球点领取第j个气球f[i,j]:=min(f[k,j-1]+dist[i,j])    {i<>k}f[i,1]:=起点到每一个气球店的距离第x层最小的移动距离为min{f[i,m-air[x]]+终点到i的距离}

and 不能再把数据范围看错了

code:
var n,m,q:longint;    pole:array[1..200]of record                        x,y:longint;                        end;    air:array[1..200]of longint;    number:array[1..200]of longint;    position:array[1..200,1..60]of record                            x,y:longint;                            end;    f:array[1..1010,1..1000]of double;    dist1,dist2:array[1..100]of double;    dist:array[1..100,1..100]of double;    ii,i,j,k:longint;    sx,sy,fx,fy:longint;    x,y,z:longint;    min,ans:double;    temp:double;
begin       readln(n,m,q);      for i:=2 to n do          read(pole[i].x,pole[i].y);      for i:=1 to n-1 do          read(air[i]);      fillchar(position,sizeof(position),0);      fillchar(number,sizeof(number),0);      for i:=1 to q do          begin readln(x,y,z);                inc(number[z]);                position[z,number[z]].x:=x;                position[z,number[z]].y:=y;          end;      ans:=0;      sx:=pole[1].x;      sy:=pole[1].y;      for ii:=1 to n-1 do          begin if air[ii]<m                   then begin fillchar(dist1,sizeof(dist1),0);                              fillchar(dist2,sizeof(dist2),0);                              fillchar(dist,sizeof(dist),0);                              for i:=1 to number[ii] do                                  dist1[i]:=sqrt(sqr(position[ii,i].x-sx)+                                                 sqr(position[ii,i].y-sy));                              for i:=1 to number[ii] do                                  for j:=1 to number[ii] do                                      dist[i,j]:=sqrt(sqr(position[ii,i].x-position[ii,j].x)+                                                      sqr(position[ii,i].y-position[ii,j].y));                              for i:=1 to number[ii] do                                  for j:=1 to m-air[ii] do                                      f[i,j]:=maxint*5000;                              for i:=1 to number[ii] do                                  f[i,1]:=dist1[i];                              fx:=pole[ii+1].x;                              fy:=pole[ii+1].y;                              for i:=1 to number[ii] do                                  dist2[i]:=sqrt(sqr(position[ii,i].x-fx)+                                                 sqr(position[ii,i].y-fy));                              for j:=2 to m-air[ii] do                                  for i:=1 to number[ii] do                                      for k:=1 to number[ii] do                                          if (f[i,j]>f[k,j-1]+dist[i,k])and(i<>k)                                             then f[i,j]:=f[k,j-1]+dist[i,k];                              min:=maxlongint;                              for i:=1 to number[ii] do                                  if min>f[i,m-air[ii]]+dist2[i]                                     then min:=f[i,m-air[ii]]+dist2[i];                              ans:=ans+min;                              sx:=pole[ii+1].x;                              sy:=pole[ii+1].y;                        end                   else begin fx:=pole[ii+1].x;                              fy:=pole[ii+1].y;                              ans:=ans+sqrt(sqr(sx-fx)+sqr(sy-fy));                              sx:=pole[ii+1].x;                              sy:=pole[ii+1].y;                        end;          end;      writeln(ans:0:2);

end.

转载于:https://www.cnblogs.com/spiderKK/p/4893652.html

分层dp:天堂(heaven)相关推荐

  1. 牛客 - 降维打击(dp)

    题目链接:点击查看 题目大意:给出一个 n * m 的迷宫,0 表示道路,1表示障碍物,初始时在点 ( x , y ) 到达边界即逃离迷宫,问在时间 k 内逃离迷宫的概率有多大 题目分析:因为涉及到概 ...

  2. 【资源】首发:徐亦达老师的机器学习课件及下载(中文目录)

    徐亦达教授在github公布了他的历年机器学习相关课件.视频,黄海广博士协助徐亦达老师对课件目录进行翻译和整理,并提供下载. 徐亦达老师简介 徐亦达,现任悉尼科技大学教授,UTS全球数据技术中心机器学 ...

  3. 首发:徐亦达老师的机器学习课件及下载(中文目录)

    徐亦达教授在github公布了他的历年机器学习相关课件.视频,黄海广博士协助徐亦达老师对课件目录进行翻译和整理,并提供下载. 徐亦达老师简介 徐亦达,现任悉尼科技大学教授,UTS全球数据技术中心机器学 ...

  4. 1190: [HNOI2007]梦幻岛宝珠 - BZOJ

    Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. 数据范围:N<=100;W<=2^30 ...

  5. 层次狄利克雷过程HDP(Hierarchical Dirichlet Processes)

    HDP本质是一个聚类算法,自动决定聚类的个数. HDP-HMM也是一个聚类算法,自动决定HMM的隐状态的个数,以每个隐状态作为一个聚类. LDA是主题模型,可以被用作聚类算法. HDP也是个主题模型. ...

  6. bzoj1190梦幻岛宝珠

    Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30, ...

  7. 2020.6月做题记录

    长期计划 SAM专题 date:2020.05.21-2020.06.01 基础类: Problem Finished P3804 [模板]后缀自动机 (SAM) √√√ SP1811 LCS - L ...

  8. 【题解】慈溪中学-8.12-T3

    传送门 分层DP的思路 dpi,j,sdp_{i,j,s}dpi,j,s​表示做到第iii层,总共选了jjj个点,第iii层选了sss个点的方案数 是由上一层转移过来的,所以枚举上一层选的点数www ...

  9. 【2011集训队出题】拆迁队

    Description: lanxisi带领着他的拆迁队来整治一个街道.这个街道由N个旧房子组成,从左到右编号为1..N.每个旧房子i有一个正整数的美观度Ai. lanxisi希望整个街道从左到右美观 ...

最新文章

  1. Linux下两种实用自动交互方法
  2. C语言以递归实现插入排序Insertion Sort算法(附完整源码)
  3. 【C++深度剖析教程36】深入理解函数模板
  4. 软件开发工程师--经验之谈
  5. 代码块作用域内外的静态变量
  6. cout输出精确小数点
  7. E - 娜娜梦游仙境系列——莫名其妙的插曲
  8. HTML5模拟衣服撕扯动画
  9. winrar加密压缩
  10. 【Python抢票神器】火车票枪票软件到底靠谱吗?实测—终极攻略。
  11. SSL证书不受信任怎么办?重点关注这4点
  12. 没有财务系统如何对账?
  13. 江苏成人高考考前注意事项
  14. 未找到任何音频输出设备的解决方法
  15. git 将暂存区文件提交_git 暂存区
  16. spring上传文件
  17. 网络游戏服务器开发(一)
  18. [转] 教师的备课主要解决哪些问题?
  19. 分布式基础-谁来当老大(二)
  20. Web安全防攻(渗透测试)

热门文章

  1. STM32F407的CAN通信实验
  2. zeng studio的项目窗口PHP Explorer
  3. 百度城市大脑业务架构和总体架构
  4. java mq 积压_解决消息队列的数据积压只需这三招
  5. 多么痛的领悟:十三起惨痛宕机案例
  6. GBASE 8s 存储详解_数据类型_02_smallint
  7. 最详尽翻译:Rules of Machine Learning: Best Practices for ML Engineering
  8. php bootstrap表格,初学 Bootstrap 表格
  9. mysql-创建用户报错ERROR 1396 (HY000): Operation CREATE USER failed for 'XXXX'@'XXXX'
  10. 模拟进程创建、终止、阻塞、唤醒原语(操作系统原理实验)