一道dp错题

dis(a,b)就是两点之间的距离公式

那么这道题该怎么解呢,.先看数据范围x,y<=1e4,so,18个点两点之间距离最大18*1e4*sqrt(2)<2^18,所以如果跳过的点大于18个点,那么显然一个区间内最多不会跳跃超过17个点

现在我们想知道前i个点跳跃几次在哪跳跃能够达到最小花费,不妨设跳跃点数为j属于[0,17],k表示上一个跳跃点距离i的长度

设dp[i][j]表示前i个点跳跃j次,那么上一个跳跃点为i-k-1,由于消耗了j个跳跃点当中的4个跳跃点,所以状态转移方程为dp[i][j]=min(dp[i-k-1][j-k]+dis(i,i-k-1)-power(2,j-k-1)+power(2,j-1))为什么要减掉power(2,j-k-1)呢,因为在计算dp[i-k-1][j-k]的时候我们加上过power(2,j-k-1)

首先我们来定义一些基本的数组和变量

constexpr int N = 1e5 + 5;
struct node {double x, y;
};
double dp[N][17];
int P[17];
node a[N];
//i,j,k
//前i个点,有j个点是被跳过的,上一个弯曲点距离点i长度为k,
//i的取值范围是[2, n],j的取值范围是[0,min(i-2,16)],k的取值范围是[1,i-2]
//i能够取2是为了计算dp[2][0],j表示的是被跳过的点,那么第一个点和第i个点不能被跳过,而且任意两个点的最大距离为10^4sqrt(10^4)<2^16
//k取1到i-2是因为i-k-1作为起始跳跃点不能为0,且k为0的话起始跳跃点为i的上一个点,两个点之间无法跳跃 
double dis(int x, int y) {double diss = (a[x].x - a[y].x) * (a[x].x - a[y].x) + (a[x].y - a[y].y) * (a[x].y - a[y].y);diss = std::sqrt(diss);return diss;
}
//dis是用来计算两点之间的距离的

接下来我们输入数据

int main() {int n;std::cin >> n;for (int i = 1; i <= n; i++)std::cin >> a[i].x >> a[i].y;P[0] = 1;//p是2的次幂for (int i = 1; i <= 16; i++)P[i] = P[i - 1] * 2;//由于要计算min值,所以不妨把数组都初始化成一个很大的值for (int i = 1; i <= n; i++) {for (int j = 0; j <= 16; j++) {dp[i][j] = 1e18;}}return 0;
}

接下来完成核心代码

int main() {int n;std::cin >> n;for (int i = 1; i <= n; i++)std::cin >> a[i].x >> a[i].y;P[0] = 1;for (int i = 1; i <= 16; i++)P[i] = P[i - 1] * 2;for (int i = 1; i <= n; i++) {for (int j = 0; j <= 16; j++) {dp[i][j] = 1e18;}}//为什么要单独把1拎出来,因为我们之前初始化把dp[1][0]也设成1e18了//什么时候会用到1,0?当j==0,i==2,i-1=1时,在下面dp[i][j] = dp[i - 1][j]中会用到dp[1][0] = 0;for (int i = 2; i <= n; i++) {for (int j = 0; j <= std::min(i - 2, 16); j++) {//跳跃点数相同,那就只能是上一个点 dp[i][j] = dp[i - 1][j] + dis(i, i - 1);for (int k = 1; k <= j && i - k - 1 >= 1; k++) {dp[i][j] = std::min(dp[i][j], dp[i - k - 1][j - k] + dis(i - k - 1, i) - P[j - k - 1] + P[j - 1]);}}}double ans = 1e20;for (int j = 0; j <= 16; j++) {ans = std::min(ans, dp[n][j]);}std::cout << std::fixed << std::setprecision(3) << ans << '\n';return 0;
}

分别枚举i到j的范围,由于i-1不在状态转移方程的范围内,所以我们要在每一次枚举k之前特殊计算一次dp[i][j]=dp[i-1][j]+dis(i,i-1);

以上就是这道题的详细解答,还需勤加练习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OceanBase诊断调优】—— 转储错误(错误代码 4138/ORA-01555)

当读事务很长时&#xff0c;租户进行转储会报 4138/ORA-01555 错误。本文介绍该错误的处理方法。 适用版本 OceanBase 数据库 V2.X 及以后的版本 问题现象 当读事务很长&#xff0c;租户进行转储时会出现以下错误。 Oracle 租户&#xff1a; ORA-01555&#xff1a;snapsho…

Keil调用跟踪

调试时程序卡在一个位置&#xff0c;恰巧这个函数被很多地方调用&#xff0c;需要知道上一步在哪。 程序暂停后&#xff0c; 查看调用堆栈&#xff0c;点击Keil菜单栏中的“View”&#xff0c;然后选择“Call Stack”&#xff08;调用堆栈&#xff09;选项。这将显示当前的调用…

市场活动系统搭建

精细差异化运营在今天的企业越来越普遍&#xff0c;运营驱动占据了业务经营的主导地位。各种营销活动&#xff0c;帮助我们差异化运营、激发潜在客户、带动连带消费、增加销售额度、提升用户增长、实现品牌宣传。 天猫、京东上有各种各样的促销活动。如&#xff1a;满减、满返、…

算法day04

第一题 &#xff1a; 209. 长度最小的子数组 有上题可知&#xff0c;我们会采用双指针和单调性的思路来解决 我们本题采用左右双指针从数组的0位置同向前进&#xff0c;所以将此类模型称为滑块&#xff1b; 步骤思路如下&#xff1a; 步骤一&#xff1a; 定义所有双指针都指向…

Prompt提示词的技巧

Prompt提示词的技巧 要让GPT类模型产生最符合我们需求的输出&#xff0c;我们需要精心设计和调整输入的提示词&#xff08;Prompt&#xff09;。 1、明确性&#xff1a; 确保你的提示词清晰、具体。GPT类模型会根据你给出的信息来生成文本&#xff0c;因此&#xff0c;提供详…

【实践】使用vscode来debug go程序的尝鲜

配置 首先&#xff0c;当然得配置好vscode 的go环境&#xff0c; 装个go插件就基本满足了 配置 launch.json, 可以配置多个环境的程序启动参数&#xff08;很友好&#xff09; {"version": "0.2.0","configurations": [{"name": &…

ArrayList与LinkedList的区别

一、背景与现状 在Java编程中&#xff0c;ArrayList和LinkedList都是实现List接口的重要类&#xff0c;用于存储和操作动态大小的元素集合。两者在Java集合框架中占据了核心地位&#xff0c;并被广泛应用于各种软件项目中。然而&#xff0c;尽管它们都提供了类似的功能&#x…

海外客户开发渠道有哪些

海外客户开发是一个多元化的过程&#xff0c;涉及线上与线下多个渠道。以下是一些有效的海外客户开发渠道&#xff1a; 平台电商&#xff1a; 利用国际B2B电商平台&#xff0c;如阿里巴巴国际站、 Globalsources、Made-in-China等&#xff0c;这些平台拥有庞大的国际买家流量&a…

STM32学习和实践笔记(27):USART串口通信实验程序

本实验所要实现的功能是&#xff1a;STM32F1通过USART1实现与PC机对话&#xff0c;STM32F1的USART1收到PC机发来的数据后原封不动的返回给PC机显示。同时使用D1指示灯不断闪烁提示系统正常运行。程序框架如下&#xff1a; &#xff08;1&#xff09;初始化USART1&#xff0c;并…

linux 开发常用命令

一、查看 相关服务 1.查看 数据库 相关服务 这里以mysql 和 redis 为例 &#xff08;1&#xff09;使用 ps 命令 执行命令会列出&#xff0c;“mysql”、“redis”名称的进程 ps aux | grep redis 示例&#xff1a; rootspray:~# ps aux | grep mysql mysql 1609816 0.…

Flutter 中的 FilterChip 小部件:全面指南

Flutter 中的 FilterChip 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;FilterChip 是一种特殊类型的 Chip&#xff0c;用于呈现过滤选项。用户可以通过点击 FilterChip 来应用相应的过滤条件&#xff0c;这在需要对列表或集合进行筛选的场景中非常有用&#xff0c;如…

51单片机实现俄罗斯方块游戏编程

一、设计要求 &#xff08;1&#xff09;利用51单片机&#xff0c;设计一款俄罗斯方块游戏&#xff0c;完成硬件电路的开发和程序的编写调试&#xff1b; &#xff08;2&#xff09;采用LCD12864液晶作为游戏运行界面&#xff1b; &#xff08;3&#xff09;利用按键输入灵活…

Spring Boot集成dubbo快速入门Demo

1.什么是dubbo&#xff1f; Apache Dubbo 是一款微服务开发框架&#xff0c;它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着&#xff0c;使用 Dubbo 开发的微服务&#xff0c;将具备相互之间的远程发现与通信能力&#xff0c; 同时利用 Dubbo 提供的丰富服务治理能力…

HTML飘落的花瓣

目录 写在前面 HTML​​​​​​​简介 完整代码 代码分析 系列推荐 写在最后 写在前面 本期小编给大家推荐HTML实现的飘落的花瓣&#xff0c;无需安装软件&#xff0c;直接下载即可打开~ HTML​​​​​​​简介 HTML&#xff08;Hypertext Markup Language&#xff…

探索Playwright:Python下的Web自动化测试革命

在如今这个互联网技术迅速发展的时代&#xff0c;web应用的质量直接关系着企业的声誉和用户的体验。因此&#xff0c;自动化测试成为了保障软件质量的重要手段之一。今天&#xff0c;我将带大家详细了解一款在测试领域大放异彩的神器——Playwright&#xff0c;并通过Python语言…

一觉醒来 AI科技圈发生的大小事儿 05月13日

&#x1f4f3;博弈论让 AI 更加正确、高效&#xff0c;LLM 与自己竞争 研究团队设计了共识博弈&#xff0c;通过让语言模型的生成器和判别器相互博弈来提高模型的准确性和内部一致性。这种方法不需要对基础模型进行训练或修改&#xff0c;可以在笔记本电脑上快速执行。研究结果…

基于微信小程序+JAVA Springboot 实现的【停车场小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 停车场微信小程序的设计与实现 在当前信息技术飞速发展的背景下&#xff0c;停车场微信小程序的开发成为了一个创新的解决方案&#xff0c;旨在提高停车场管理的效率和用户的停车体验。本项目通过深入分析现有停车场管理系统的不足&#xff0c…

内存屏障 - LINUX KERNEL MEMORY BARRIERS 上 与 下

内存屏障&#xff08;Memory Barrier&#xff09;是在计算机体系结构中使用的一种同步机制&#xff0c;用于确保在多线程或多核处理器环境中&#xff0c;对共享内存的操作按照预期顺序进行。它们通过强制在特定点执行一些指令来规定内存访问的顺序&#xff0c;并防止内存乱序执…

弱网对抗的策略有哪些?

在弱网环境下&#xff0c;数据传输可能会面临丢包、延迟、抖动等问题&#xff0c;因此采取合适的弱网对抗策略对于确保数据传输的稳定性和可靠性至关重要。以下是一些常见的弱网对抗策略&#xff1a; 数据压缩&#xff1a;使用压缩算法如Gzip、Brotli等对数据进行压缩&#xf…

Linux-vi/vim

vi是一个文本编辑器&#xff0c;用于撰写文档或开发程序 vim是vi的增强版&#xff0c;功能一致&#xff0c;可视化效果更好一些&#xff0c;去鼠标化&#xff0c;编辑更加方便&#xff0c;可定制化 vim编辑器是一个模式化文本编辑工具 vim有三种模式 编辑模式、插入模式和末…