一道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);

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue的学习 —— <vue响应式基础>

目录 前言 正文 单文件组件 什么是单文件组件 单文件组件使用方法 数据绑定 什么是数据绑定 数据绑定的使用方法 响应式数据绑定 响应式数据绑定的使用方法 ref() 函数 reactive()函数 toRef()函数 toRefs()函数 案例练习 前言 Vue.js 以其高效的数据绑定和视图…

2024统计建模中国新质生产力统计测度与时空演变及其驱动因素研究

高质量成品论文46页word版本1.5w字书写完整数据集1000行py代码一等奖论文&#xff01;这里仅展示部分内容&#xff0c;完整版在下面的链接。 【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/ 中国新质生产…

【码农日常】将mp4转换为逐帧图片

项目场景&#xff1a; 拍摄了一段视频记录设备工作的状态和测量仪器的实时数据。由于测量仪器岁数比较大&#xff0c;不够智能&#xff0c;遂打算将视频转换为逐帧图片进行分析。 网上没找到现成工具&#xff0c;借鉴网上大神的操作方式打算用python写一个工具。 问题描述 用…

基于springboot实现政府管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现政府管理系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff…

华为设备display查看命令

display version //查看版本信息 display current-configuration //查看配置详情 display this //查看当前视图有效配置 display ip routing-table //查看路由表 display ip routing-table 192.168.3.1 //查看去往3.1的路由 display ip interface brief //查看接口下ip信息 dis…

PXIe规格i3/i5/i7单板计算机控制器

是专为PXIe混合测试系统设计的主控制器&#xff0c;3U 12HP PXIe规格。该产品采用Intel Core™i3/i5/i7 第四代高性能处理器&#xff0c;内存可支持高达16G DDR3L。该系统PXI Express的link配置为通用的4Port 4lane的模式&#xff0c;数据吞吐量高达8GB/S。 CX786x提供丰富灵活…

机器学习(2)

目录 2-1泛化能力 2-2过拟合和欠拟合 2-3三大问题 2-4评估方法 2-5调参和验证集 2-6性能度量 2-7比较检验 2-1泛化能力 如何进行模型评估与选择&#xff1f; 2-2过拟合和欠拟合 泛化误差&#xff1a;在“未来”样本上的误差 经验误差&#xff1a;在训练集上的误差&am…

什么叫拆分盘?什么是拆分盘!一篇文章带你了解!

随着互联网金融的快速发展&#xff0c;各种新型投资模式层出不穷&#xff0c;其中拆分盘作为一种只涨不跌的理财方式&#xff0c;吸引了众多投资者的目光。本文将结合一个简单的拆分盘示例&#xff0c;对拆分盘的投资逻辑进行解析&#xff0c;并探讨其潜在风险&#xff0c;以帮…

每日一题11:Pandas:数据重塑-透视

一、每日一题 解答&#xff1a; import pandas as pddef pivotTable(weather: pd.DataFrame) -> pd.DataFrame:df_pivot weather.pivot(indexmonth, columnscity, valuestemperature)return df_pivot 题源&#xff1a;力扣 二、总结 Pandas 是一个强大的 Python 数据分析…

怎么申请一年期免费的https证书

随着互联网的推广和普及&#xff0c;如今HTTPS证书的普及度还是比较高的了&#xff0c;大家对于https证书的需求度也在日益提升。针对于一些个人用户或是企业而言&#xff0c;实现网站的https访问已经成为了一种标配。从去年年底开始&#xff0c;各大SSL证书厂商陆续下架一年期…

FOTS:一种用于机器人操作技能Sim2Real学习的快速光学触觉仿真器

类 GelSight的视触觉传感器具有高分辨率和低制造成本的优势&#xff0c;但是在与现实中的物体进行频繁接触时易受磨损。而触觉仿真器可大幅降低硬件成本&#xff0c;同时为后续技能学习任务提供仿真训练环境。为此&#xff0c;来自东南大学自动化学院的钱堃副教授研究团队和伦敦…

LeetCode---循环队列

循环队列就是只有固定的内存&#xff0c;存数据&#xff0c;出数据&#xff0c;但是也和队列一样&#xff0c;先进先出。如下图所示&#xff0c;这是他的样子 在head出&#xff0c;tail进&#xff0c;但是这个如果用数组解决的话&#xff0c;就有问题&#xff0c;力扣给我们的接…

宝塔Linux面板5.9版本升级新版失败解决方法

下载地址&#xff1a;宝塔Linux面板5.9升级教程 宝塔5.9版本升级最新版宝塔失败&#xff0c;可以参考这份详细教程&#xff08;不断更新中&#xff09; 安装要求&#xff1a; Python版本&#xff1a; 2.6/2.7&#xff08;安装宝塔时会自动安装&#xff09; 内存&#xff1a;1…

java生成图形验证码

java生成图形验证码 在写项目的时候登录的方式有多种多样&#xff0c;根据需求的不同&#xff0c;有些是用手机号获取验证码登录&#xff0c;有些是需要账号&#xff0c;密码 手机验证码登录&#xff0c;还有写是需要账号&#xff0c;密码 图形验证码登录&#xff0c;不论怎样…

【MySQL】sql表设计的注意事项

程序员的实用神器 文章目录 程序员的实用神器强烈推荐引言注意事项强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 推荐一个个人工作&#x…

机器学习案例:加州房产价格(四)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/#_12 数据探索和可视化、发现规律 通过之前的工作&#xff0c;你只是快速查看了数据&#xff0c;对要处理的数据有了整体了解&#xff0c;现在的目标是更深的探索数据。 首先&#xff0c;保证你将测试集放在了一旁&…

数据库开发记录

一.MySQL相关 1.Spatial Data相关

AntDesign React 简单封装一个带错误提示的输入框

背景 没想到官方没有提供纯粹的带错误提示的输入框&#xff0c;官方提供了启用错误样式 status 属性。但是展示错误信息提示却需要捆绑Form 和 Form.Item。说实话有点不友好&#xff0c;我就一个简单的输入框&#xff0c;想要用户输入时用正则校验&#xff0c;错误时提示一些错…

电子硬件设计-LTC3839学习笔记

目录 1. 简介 2. 用法详解 2.1 工作原理 2.2 关键引脚分析 2.2.1 Pin6 - ITH 2.2.2 Pin 14/27 - BOOST1/2 3. 总结 1. 简介 具差分输出检测功能的快速、准确、两相、单路输出降压型 DC/DC 控制器。 特点&#xff1a; 输入&#xff1a;4.5V 至 38V&#xff0c;输出&am…