https://www.luogu.org/problemnew/show/P2551

首先这道题没有给Hm的最大值,很坑,只能随便开一个100没想到还过了。

观察题目,发现虽然高度可以变化,但是速度是不会下降的。

那么就可以考虑dp,设 \(dp[h][v]\) 表示从开始状态 \(dp[h1][v1]=0\) 到达高度为h,且速度为v的最短的时间。

搞个记忆化搜索就可以了。

需要注意的地方是,不知道什么玄学原因,不能在h为1的时候俯冲,大概是怕撞到地面吧。

要么给h加上上限hm,要么赋值初始化dp为INF标记为禁止状态。

这道题绝对不是蓝色难度,顶多绿色。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int INF=0x3f3f3f3f;
  5. int h1,v1,h2,v2,dh,hm;
  6. struct Node{
  7. int cost;
  8. int preh,prev;
  9. char op;
  10. Node(){};
  11. Node(int _cost,int _preh,int _prev):cost(_cost),preh(_preh),prev(_prev){};
  12. }node[105][7];
  13. bool vis[105][7];
  14. int costtime[105][7][4];
  15. int DP(int h,int v){
  16. //printf("h=%d v=%d\n",h,v);
  17. if(vis[h][v]){
  18. //printf("h=%d v=%d\n",h,v);
  19. //printf(" ret=%d\n",node[h][v].cost);
  20. return node[h][v].cost;
  21. }
  22. else{
  23. vis[h][v]=1;
  24. if(v<v1){
  25. //printf("h=%d v=%d\n",h,v);
  26. //printf(" ret=INF\n");
  27. node[h][v].cost=INF;
  28. return INF;
  29. }
  30. if(h==h1&&v==v1){
  31. //printf("h=%d v=%d\n",h,v);
  32. //printf(" ret=0\n");
  33. node[h][v].cost=0;
  34. return 0;
  35. }
  36. int &cost=node[h][v].cost;
  37. int &preh=node[h][v].preh;
  38. int &prev=node[h][v].prev;
  39. char &op=node[h][v].op;
  40. cost=INF;
  41. if(h!=0){
  42. int tcost=DP(h-1,v)+costtime[h-1][v][1];
  43. if(tcost<cost){
  44. preh=h-1;
  45. prev=v;
  46. cost=tcost;
  47. op='R';
  48. }
  49. }
  50. if(v!=0){
  51. int tcost=DP(h,v-1)+costtime[h][v-1][2];
  52. if(tcost<cost){
  53. preh=h;
  54. prev=v-1;
  55. cost=tcost;
  56. op='A';
  57. }
  58. }
  59. if(h>=2&&h+1<=hm){
  60. int tcost=DP(h+1,v-1)+costtime[h+1][v-1][3];
  61. if(tcost<cost){
  62. preh=h+1;
  63. prev=v-1;
  64. cost=tcost;
  65. op='D';
  66. }
  67. }
  68. //printf("h=%d v=%d\n",h,v);
  69. //printf(" ret=%d\n",cost);
  70. return cost;
  71. }
  72. }
  73. void out(int h,int v){
  74. if(h==h1&&v==v1){
  75. return;
  76. }
  77. else{
  78. out(node[h][v].preh,node[h][v].prev);
  79. }
  80. printf("%c",node[h][v].op);
  81. }
  82. int main() {
  83. scanf("%d%d%d%d%d%d",&h1,&v1,&h2,&v2,&dh,&hm);
  84. h1/=dh,h2/=dh,hm/=dh;
  85. for(int i=0;i<hm;i++){
  86. for(int j=1;j<=6;j++){
  87. scanf("%d",&costtime[i][j][1]);
  88. }
  89. }
  90. for(int i=0;i<=hm;i++){
  91. for(int j=1;j<=5;j++){
  92. scanf("%d",&costtime[i][j][2]);
  93. }
  94. }
  95. for(int i=2;i<=hm;i++){
  96. for(int j=1;j<=5;j++){
  97. scanf("%d",&costtime[i][j][3]);
  98. }
  99. }
  100. memset(vis,0,sizeof(vis));
  101. printf("%d\n",DP(h2,v2));
  102. out(h2,v2);
  103. printf("\n");
  104. }

洛谷 - P2551 - 华夏60战斗机 - 简单dp的更多相关文章

  1. 洛谷 - P1004 - 方格取数 - 简单dp

    https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...

  2. 洛谷 - P1115 - 最大子段和 - 简单dp

    https://www.luogu.org/problemnew/show/P1115 简单到不想说……dp[i]表示以i为结尾的最大连续和的值. 那么答案肯定就是最大值了.求一次max就可以了. 仔 ...

  3. (水题)洛谷 - P2439 - 阶梯教室设备利用 - 简单dp

    https://www.luogu.org/fe/problem/P2439 很明显时间是一个维度,按照时间顺序决策就行了. dp[i]表示以时间i为结尾所能达到的最长演讲时间. #include & ...

  4. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  5. 华夏60 战斗机(最短路dijkstra)

    华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...

  6. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  7. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  8. 洛谷P1063 能量项链(区间DP)(环形DP)

    To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...

  9. 洛谷P1880 石子合并(区间DP)(环形DP)

    To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...

随机推荐

  1. SQLMAP源码分析(一)

    说起来,学习Python很大一部分原因是由于对WEB安全的兴趣以及对SQLMAP这款工具的好奇,曾经设想学完Python基础就读一读SQLMAP源码,然而懒病一犯,随之就大江东去.近来,又重新燃起了读 ...

  2. 一套Tomcat处理多个域名请求 - Virtual Host

    最近和Tomcat较上劲了... 作为Tomcat的系列之一,来尝试下如何用一套Tomcat来处理多个域名请求. 场景:基于成本考虑,多个department共用一台服务器,然后该服务器上就一套Tom ...

  3. 【转】IDA远程调试 The debugger could not attach to the selected process. irs_recv 等待的操作过时

    IDA连接android_server 选中进程点ok之后 连接不上报错 The debugger could not attach to the selected process. This can ...

  4. 安装Ubuntn 和 pycharm

    Ubuntu安装之python开发   什么??公司要用Ubuntu(乌班图)?不会用??怎么进行python开发??? 乌班图操作系统下载地址:http://releases.ubuntu.com/ ...

  5. Java面试-Hibernate总结

    1  Hibernate的检索方式 Ø  导航对象图检索(依据已经载入的对象.导航到其它对象. ) Ø  OID检索(依照对象的OID来检索对象. ) Ø  HQL检索(使用面向对象的HQL查询语言. ...

  6. jquery中attr和prop的区别—判断复选框选中状态

    最近项目中需要用jquery判断input里checkbox是否被选中,发现用attr()获取不到复选框改变后的状态,最后查资料发现jQuery 1.6以后新增加了prop()方法,借用官方的一段描述 ...

  7. jquery特效(3)—轮播图①(手动点击轮播)

    写了一个轮播图练练手,先写了一个手动点击轮播的轮播图,随后我会慢慢接着深入写自动轮播图和鼠标悬浮图片停止移动轮播图等,虽然今天我生日,但是代码还是得写的,不能找借口放松自己,原地踏步也算后退. 下面来 ...

  8. 【转】C#中使用Redis学习二 在.NET4.5中使用redis hash操作

    摘要 上一篇讲述了安装redis客户端和服务器端,也大体地介绍了一下redis.本篇着重讲解.NET4.0 和 .NET4.5中如何使用redis和C# redis操作哈希表.并且会将封装的一些代码贴 ...

  9. hdu-5748 Bellovin(LIS)

    题目链接: Bellovin Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others ...

  10. 烂笔头——JAVA.String

    人们说 Sting+ 的效率很低 String+的编译步骤是: new StringBuilder() new String.valueof() StringBuilder.<init> ...