当前位置: 首页 > news >正文

蓝桥杯 蜗牛 动态规划

16.蜗牛 - 蓝桥云课https://www.lanqiao.cn/problems/4985/learning/?page=1&first_category_id=1&second_category_id=3&sort=difficulty&asc=1&tags=%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E9%80%92%E6%8E%A8,01%E8%83%8C%E5%8C%85,%E5%8C%BA%E9%97%B4DP,%E6%95%B0%E4%BD%8DDP,%E6%96%9C%E7%8E%87%E4%BC%98%E5%8C%96,%E6%9C%9F%E6%9C%9BDP,%E6%A0%91%E5%BD%A2DP,%E7%8A%B6%E5%8E%8BDP,%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98,%E8%AE%B0%E5%BF%86%E5%8C%96%E6%90%9C%E7%B4%A2&tag_relation=union

一道DP题 

要求求出从原点开始到第N根柱子(竹竿)的底部的最短时间

所以我们要设置一个DP数组 dp[i]表示到第i根柱子底部的最短时间

以到第三根柱子底部的最短时间为例子

我们发现有两种方法可以到达第三根柱子的底部

第一种,从出发点1 开始走第二根柱子的传送门,传送到第三根柱子的相应位置pre然后从pre走到第三根柱子底部;

第二种,从第二根柱子的底部直接过来第三根柱子的底部 ;

考虑第一种方法的原因在于 如果两根柱子离得非常远 比如距离为10000,而走传送门在柱子上移动的距离只有10,远小于直接走X轴

考虑第二种方法的原因在于 有可能两柱子离得非常近 比如在x轴的距离为1 ,传送门却非常高,比如传送门高度10000;因此直接从底下走过去更快

因此实际上我们需要计算出到第i根柱子的底部的最短时间,实际上需要到第i-1根柱子的传送门的最短时间,和到第i-1根柱子底部的最短时间两个数据

分别记作dp[i-1][0],dp[i-1][1]

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
typedef long long ll; 
int n;
struct node{double cur;double nxt;double pre;double x;
};
double dp[N][2]; 
node a[N];int main(){cin>>n;for(int i = 1 ; i<=n;i++){cin>>a[i].x ;}for(int i = 1;i<n;i++){cin>>a[i].cur ;  //当前柱子的传送门位置 cin>>a[i].nxt ; //传送到下一根柱子的位置 a[i].pre = a[i-1].nxt ; //被上一根柱子传送过来的出口 }a[0].x   = 0;a[0].cur = 0;a[n].cur = a[n-1].nxt ;a[n].pre = a[n-1].nxt ;dp[0][1] = 0;dp[0][0] = 1e8;for(int i = 1 ; i <= n;i++){double add1 ; //上个传送门传过来 再走到当前传送门 //传送门有可能在上一个柱子出口的上面 也可能在出口的下面 if(a[i].cur > a[i].pre ){add1 = (a[i].cur - a[i].pre)/((0.7)*1.0) ;  }else if(a[i].cur <= a[i].pre ){add1 = (a[i].pre - a[i].cur)/((1.3)*1.0) ; }double timecur1 = dp[i-1][0] + add1;   ///到上个柱子传送门的最短时间 +  被传送出来后走到当前柱子传送门的时间 double line11 = dp[i-1][1];                double line12 = a[i].x - a[i-1].x ;       //右 double line13 = a[i].cur /((0.7)*1.0);    //上 double timecur2 = line11 + line12 +line13 ;/// 在上个柱子底部的最短时间  + 走到第i根柱子再上传送门 dp[i][0] = min(timecur1,timecur2); //到当前柱子传送门最短时间 double timedown1 = dp[i-1][1] + a[i].x - a[i-1].x; //从上个柱子底直接走到这个柱子底部 double line22 = a[i].pre/((1.3)*1.0); //从传送门下到柱子底部 double timedown2 = dp[i-1][0]   + line22;dp[i][1] = min(timedown1,timedown2);//到当前柱子底最短时间 }printf("%.2lf",dp[n][1]);return 0;
}

http://www.xdnf.cn/news/31933.html

相关文章:

  • 遨游科普:防爆平板是指什么?有哪些应用场景?
  • 使用vue2技术写了一个纯前端的静态网站商城-鲜花销售商城
  • javassist
  • Python concurrent.futures模块的ProcessPoolExecutor, ThreadPoolExecutor类介绍
  • 在 Node.js 中使用原生 `http` 模块,获取请求的各个部分:**请求行、请求头、请求体、请求路径、查询字符串** 等内容
  • Python爬虫实战:获取网易新闻数据
  • Windows系统安装`face_recognition`
  • 2. ubuntu20.04 和VS Code实现 ros的输出 (C++,Python)
  • DeepSeek与Napkin:信息可视化领域的创新利器
  • [matlab]南海地形眩晕图代码
  • Github 2025-04-19Rust开源项目日报 Top10
  • Prompt-Tuning 提示词微调
  • 机器学习核心算法全解析:从基础到进阶的 18 大算法模型
  • MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
  • 10软件测试需求分析案例-查询学习信息
  • 详讲Linux下进程等待
  • Go-zero框架修改模版进行handler统一响应封装
  • 手撕 简易HashMap
  • YOLO11改进-Backbone-使用MobileMamba替换YOLO backbone 提高检测精度
  • 在服务器上部署MinIO Server
  • JMeter实现UI自动化测试的完整方案
  • 配置管理与系统文档
  • MyImgConverter:图片批量处理工具
  • 智能提示语全周期优化系统:云原生架构设计与工程实践
  • LPDDR中读操作不存在Additive Latency(AL)的技术思考
  • opencv 最近邻插值法的原理
  • 集合框架(详解)
  • 手机投屏到电视方法
  • 从UDS协议学习ISO网络七层架构:汽车诊断网络协议的分层逻辑剖析
  • vue3专题1------父组件中更改子组件的属性