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标记为禁止状态。

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int INF=0x3f3f3f3f; int h1,v1,h2,v2,dh,hm; struct Node{
int cost;
int preh,prev;
char op;
Node(){};
Node(int _cost,int _preh,int _prev):cost(_cost),preh(_preh),prev(_prev){};
}node[105][7]; bool vis[105][7];
int costtime[105][7][4]; int DP(int h,int v){
//printf("h=%d v=%d\n",h,v);
if(vis[h][v]){
//printf("h=%d v=%d\n",h,v);
//printf(" ret=%d\n",node[h][v].cost);
return node[h][v].cost;
}
else{
vis[h][v]=1;
if(v<v1){
//printf("h=%d v=%d\n",h,v);
//printf(" ret=INF\n");
node[h][v].cost=INF;
return INF;
}
if(h==h1&&v==v1){
//printf("h=%d v=%d\n",h,v);
//printf(" ret=0\n");
node[h][v].cost=0;
return 0;
}
int &cost=node[h][v].cost;
int &preh=node[h][v].preh;
int &prev=node[h][v].prev;
char &op=node[h][v].op;
cost=INF;
if(h!=0){
int tcost=DP(h-1,v)+costtime[h-1][v][1];
if(tcost<cost){
preh=h-1;
prev=v;
cost=tcost;
op='R';
}
}
if(v!=0){
int tcost=DP(h,v-1)+costtime[h][v-1][2];
if(tcost<cost){
preh=h;
prev=v-1;
cost=tcost;
op='A';
}
}
if(h>=2&&h+1<=hm){
int tcost=DP(h+1,v-1)+costtime[h+1][v-1][3];
if(tcost<cost){
preh=h+1;
prev=v-1;
cost=tcost;
op='D';
}
}
//printf("h=%d v=%d\n",h,v);
//printf(" ret=%d\n",cost);
return cost;
}
} void out(int h,int v){
if(h==h1&&v==v1){
return;
}
else{
out(node[h][v].preh,node[h][v].prev);
}
printf("%c",node[h][v].op);
} int main() {
scanf("%d%d%d%d%d%d",&h1,&v1,&h2,&v2,&dh,&hm);
h1/=dh,h2/=dh,hm/=dh; for(int i=0;i<hm;i++){
for(int j=1;j<=6;j++){
scanf("%d",&costtime[i][j][1]);
}
} for(int i=0;i<=hm;i++){
for(int j=1;j<=5;j++){
scanf("%d",&costtime[i][j][2]);
}
} for(int i=2;i<=hm;i++){
for(int j=1;j<=5;j++){
scanf("%d",&costtime[i][j][3]);
}
} memset(vis,0,sizeof(vis)); printf("%d\n",DP(h2,v2));
out(h2,v2);
printf("\n");
}

最新文章

  1. 【原】iOS学习之极光推送
  2. IDEA工具使用说明
  3. 票据OCR前预处理 (附Demo)
  4. Java的动态代理(dynamic proxy)
  5. ASP.NET 4.5新特性WebAPI从入门到精通
  6. php面向对象的特性:OOP的封装
  7. (转)JVM参数调优八大技巧
  8. 深入了解一下PYTHON中关于SOCKETSERVER的模块-B
  9. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
  10. codevs1166 矩阵取数游戏
  11. 【JS】依据表格ID进行排序(附凝视)
  12. B/S 架构中,网络模型的分解与协议解析
  13. iOS libyuv
  14. ELK---日志分析系统
  15. 一步步教你轻松学奇异值分解SVD降维算法
  16. ASP.NET CORE 中用单元测试测试控制器
  17. python 新式类的 __getattribute__
  18. Android摘抄总结
  19. 【九天教您南方cass 9.1】02 从地形图上绘制纵横断面
  20. 负数字符串经过int处理之后还是负数

热门文章

  1. OpenCV 环境搭建( Win7 32位 / VS2010 / OpenCV2.4.8 )
  2. java中 hashCode() 和 equals()
  3. android arcmenu
  4. Android 调用QQ登录
  5. WWDC2014 IOS8 APP Extensions
  6. hdu5258简单枚举
  7. 用Darwin开发RTSP级联服务器(拉模式转发)(附源码)
  8. HDU 1829/POJ 2492 A Bug&#39;s Life
  9. Understand .sync in Vue
  10. extjs grid renderer参数用法