洛谷 P1433 吃奶酪 状态压缩dp

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码实现
  • 总结


题目链接

链接: P1433 吃奶酪

题目描述

在这里插入图片描述

解题思路

首先,这个程序是用来解决洛谷上题目编号为 P1433 的问题——吃奶酪,使用了状压DP算法。

整体算法的思路是利用动态规划,通过状态压缩来解决问题。题目要求找出一条路径,使得从原点出发,经过所有的奶酪点且最后返回原点,使得总路径最短。程序中的主要数据结构是数组和存储奶酪坐标的变量。

具体来说,主要分为以下步骤:

  1. 预处理阶段:

    • 预先计算出每两个奶酪点之间的距离,存储在数组 a 中,用于后续的状态转移计算。
  2. 初始化阶段:

    • 初始化状态压缩DP数组 F,将其所有值置为无穷大。
  3. 状态转移阶段:

    • 通过状态压缩和动态规划的思想,枚举所有可能的路径状态(使用二进制表示),并根据状态转移方程更新数组 F 中每一种状态的最短距离。
  4. 输出结果:

    • 最后输出结果,找到包含所有奶酪点的最短路径的长度。

代码实现

#include <cstdio>
#include <cstring> 
#include <cmath> 
#define min(a,b) (((a)<(b))?(a):(b)) 
//洛谷 P1433 吃奶酪 状压DP
double a[20][20];//预处理,从第i块到第j块的距离,使用两点之间距离公式 
double x[20],y[20];//每块奶酪的横、纵坐标
double F[18][34000];//状压DP数组 在第i个点上,走过的二进制状态的十进制表达为j时,最短的距离 
int N; 
double distance(int v,int w)//计算第v个和第w个奶酪之间的距离 
{
	return sqrt((x[v]-x[w])*(x[v]-x[w])+(y[v]-y[w])*(y[v]-y[w]));//两点间距离公式 
}
int main()
{
	int i,j,k;
	double ans;
	memset(F,127,sizeof(F));//这样可以给浮点数赋值无穷大 
	ans=F[0][0];
	scanf("%d",&N);
	for(i=1;i<=N;i++)
	{
		scanf("%lf%lf",&x[i],&y[i]);//数据读入 
	}
	x[0]=0;y[0]=0;
	for(i=0;i<=N;i++)
	{
		for(j=i+1;j<=N;j++)
		{
			a[i][j]=distance(i,j);//初始化距离数组 
			a[j][i]=a[i][j];
		}
	} 
	for(i=1;i<=N;i++)//初始化 
	{
		F[i][(1<<(i-1))]=a[0][i];//在i点上且只有经过i点时距离是原点到i点的距离 
	}
	for(k=1;k<(1<<N);k++)//枚举所有二进制的状态 
	{
		for(i=1;i<=N;i++)
		{
			if((k&(1<<(i-1)))==0)
				continue;//i的位置没被走过,所以不需要再继续计算了 
			for(j=1;j<=N;j++)
			{
				if(i==j)
					continue;//同一个点不需要再计算 
				if((k&(1<<(j-1)))==0)
					continue;//j的位置没走过  
				F[i][k]=min(F[i][k],F[j][k-(1<<(i-1))]+a[i][j]);
			} 
		} 
	} 
	for(i=1;i<=N;i++)
	{
		ans=min(ans,F[i][(1<<N)-1]);
	}
	printf("%.2f\n",ans);
}

总结

状态压缩DP算法

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

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

相关文章

树莓派部署Nginx服务结合内网穿透实现远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

TF卡在心电监测仪中的多功能应用

TF卡在心电监测仪中的应用 TF卡&#xff08;Micro SD卡&#xff09;在心电仪器上的应用主要是用作存储设备&#xff0c;用于保存心电信号数据和其他相关信息。以下是TF卡在心电仪器上的一些常见应用&#xff1a; 1、数据存储&#xff1a; TF卡用于存储从心电仪器采集到的心电信…

SRC实战 | 后台登录绕过分享

本文由掌控安全学院 - 小袅投稿 一.挖掘过程简述&#xff1a; 通过收集到的账号密码进入后进行测试无果&#xff0c;查看登录返回包后修改role_id参数进入管理员后台&#xff0c;后台存在文件上传功能且对文件后缀和内容有检查&#xff0c;后缀检测时前端进行的&#xff0c;可…

c#之构值类型和引用类型

值类型:(整数/bool/struct/char/小数) 引用类型:(string/ 数组 / 自定义的类 / 内置的类) 值类型只需要一段单独的内存,用于存储实际的数据 引用类型需要两段内存(第一段存储实际的数据,他总是位于 堆中第二段是一个引用,指向数据在堆中的存放位置) 当使用引用类型赋值的时…

【Python自动化测试】如何才能让用例自动运行完之后,生成一张直观可看易懂的测试报告呢?

小编使用的是unittest的一个扩展HTMLTestRunner 环境准备 使用之前&#xff0c;我们需要下载HTMLTestRunner.py文件 点击HTMLTestRunner后进入的是一个写满代码的网页&#xff0c;小编推荐操作&#xff1a;右键 --> 另存为&#xff0c;文件名称千万不要改 python3使用上述…

LeetCode.209. 长度最小的子数组

题目 题目链接 分析 本题的题意就是让我们找最短的子数组和 > target 的子数组的长度。 首先最能想到的就是暴力方法&#xff0c;外层循环以数组每一个元素都作为起点&#xff0c;内存循环累加元素&#xff0c;当大于等于 target 的时候记录当前元素个数&#xff0c;更新…

.net winform 使用NModbus4建立 modbus tcp通讯

1、使用nuget引入NModbus4。 2、编写TCP访问modbus的方法 public void StartTcpClient(string ipstr,string portstr,ushort adress, ushort readLenth) { try { IPAddress myIP IPAddress.Parse(ipstr); in…

GM/T 0018-2012 设备接口描述笔记

GM/T 0018-2012 设备接口描述笔记 文章目录 GM/T 0018-2012 设备接口描述笔记6. 设备接口描述6.1 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置6.2 设备管理类函数6.3 密钥管理类函数6.4 非对称算法运算类函数6.5 对称算法运算类函数6.6 杂凑运算类函数6.7 用户…

单调队列优化DP模型整理

135. 最大子序和&#xff08;活动 - AcWing&#xff09; 找一个长度不超过m的连续子序列&#xff0c;但是并未指定这个子序列的长度&#xff0c;所以长度就有很多种选择&#xff0c;要获取任意一段长度的序列的区间和&#xff0c;那么显然要用到前缀和。然后我们来考虑&#xf…

leetcode hot100跳跃游戏

在本题中&#xff0c;我们要模仿整个跳跃过程&#xff0c;当前位置数组元素为nums[i]&#xff0c;那我们就最大能往后跳nums[i]步&#xff0c;可以小于等于这个数。如果我们直接遍历数组&#xff0c;那么我们需要每一步都控制跳跃0——nums[i]步&#xff0c;这样不可能实现。 …

ITSS证书:点亮职业发展的明灯

&#x1f4da;ITSS是中国电子技术标准化研究院推出的权威认证&#xff0c;涵盖IT服务工程师和IT服务经理的系列培训&#xff0c;旨在培养具备专业知识和技能的IT服务人才。 &#x1f31f;证书优势&#xff1a; 1️⃣提升问题解决能力&#xff1a;通过学习ITSS方法论和实践经验&…

【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手

目录 一、开启WireShark的大门 1.1 WireShark简介 1.2 常用的Wireshark过滤方式 二、如何抓包搜索关键字 2.1 协议过滤 2.2 IP过滤 ​编辑 2.3 过滤端口 2.4 过滤MAC地址 2.5 过滤包长度 2.6 HTTP模式过滤 三、ARP协议分析 四、WireShark之ICMP协议 五、TCP三次握…

Python笔记15-实战小游戏飞机大战(中)

文章目录 创建第一个敌机创建一群敌机创建多行敌机让敌机移动射杀敌机生成新的敌机群结束游戏有敌机到达屏幕底端游戏结束 在上一篇基础上继续 本示例源码地址 点击下载 创建第一个敌机 在屏幕上放置外星人与放置飞船类似。每个外星人的行为都由Alien 类控制&#xff0c;我们…

C++面试宝典第25题:阶乘末尾零的个数

题目 给定一个整数n,返回n!(n的阶乘)结果尾数中零的个数。 示例 1: 输入:3 输出:0 解释:3! = 6,尾数中没有零。 示例 2: 输入:5 输出:1 解释:5! = 120,尾数中有1个零。 解析 这道题主要考察应聘者对于数学问题的分析和理解能力,以及在多个解决方案中,寻求最优…

从零学习Linux操作系统 第二十部分 mariadb数据库的管理

一、对于数据库的基本介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracle mongodb db2 sqlite sqlserver … 3.Mysql (SUN -----> Oracle) 4.mariadb (Mysql的一种&#xff09; 数据库中的常用名词 1.字段 &#xff1a;表格中的表头 2.表 &…

MySQL原理(一)架构组成(1)物理文件组成

目录 一、日志文件 1、错误日志 Error Log 1.1、作用&#xff1a; 1.2、开启关闭&#xff1a; 1.3、使用 2、二进制日志 Binary Log & Binary Log Index 2.1、作用&#xff1a; 2.2、开启关闭&#xff1a; 2.3、Binlog还有一些附加选项参数 &#xff08;1&#x…

嵌入式C++必知必会之基础知识-常用关键字(1)

温故而知新 Hello&#xff0c;大家好&#xff01;我是木荣。温故而知新&#xff0c;可以为师矣。作为一名攻城狮&#xff0c;扎实的基本功是解决问题及完成工作中任务的重要前提。没有良好的基本功作为铺垫&#xff0c;一味的追求知识的宽度是毫无意义&#xff0c;知其然更要知…

野火霸道V2学习笔记

STM32F103学习笔记 STM32F103学习笔记说明基础配置配置KeilMDK配置串口下载程序美化Keil界面配置VScode 理论知识STM32命名方式例子 置位与清零GPIOGPIO简介GPIO和引脚的区别引脚的分类 GPIO 框图讲解保护二极管推挽输出推挽输出的含义推挽输出的原理推挽输出的特点推挽输出的应…

力扣题目训练(3)

2024年1月27日力扣题目训练 2024年1月27日力扣题目训练290. 单词规律292. Nim 游戏303. 区域和检索 - 数组不可变91. 解码方法92. 反转链表 II41. 缺失的第一个正数 2024年1月27日力扣题目训练 2024年1月27日第三天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包…

大数据Doris(六十一):SQL函数之Bitmap函数

文章目录 SQL函数之Bitmap函数 一、BITMAP_AND(BITMAP lhs, BITMAP rhs)