洛谷 P1433 吃奶酪

news2024/9/25 15:27:30

原题icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1433

Description

房间里放着 n 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0)点处。

Input

第一行有一个整数,表示奶酪的数量 n。

第 2 到第(n+1) 行,每行两个实数,第(i+1) 行的实数分别表示第 i 块奶酪的横纵坐标xi​,yi​。

Output

输出一行一个实数,表示要跑的最少距离,保留 2 位小数。

Sample 1

InputOutput
4
1 1
1 -1
-1 1
-1 -1
7.41

Hint

数据规模与约定

对于全部的测试点,保证 1≤n≤15,∣xi​∣,∣yi​∣≤200,小数点后最多有 2 位数字。

提示

解题思路

状态dp: 适用范围 N≤21

状态压缩的思想是用二进制来表示状态。用一个整数的二进制形式的每一个二进制位 0 或 1 表示一个状态。

在这里表示n块奶酪,就代表有n位二进制,每一位2进制代表一块奶酪。

例:100110 代表第2、3、6块奶酪已经吃到。

        111111 代表所有奶酪吃到。

状态转移方程:Fi,k=min⁡(Fi,k,Fj,k−2i−1+Ai,j)Fi,k​=min(Fi,k​,Fj,k−2i−1​+Ai,j​)

Fj,k−2i−1​ 为在 j 点且没有走过 i 点的最短距离, Ai,j​ 是从 i 到 j 的距离。

AC代码

状态dp

#include <iostream>
using namespace std;
#include <cstring>
#include <cmath>
#include <algorithm>
int n;
double a[16][16],x[16],y[16],f[16][33000];
//计算距离
double distance(int v,int w){
	return sqrt((x[v]-x[w])*(x[v]-x[w])+(y[v]-y[w])*(y[v]-y[w]));
}
int main(){
	cin>>n;
	x[0]=y[0]=0;
	for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
	memset(f,127,sizeof(f));
    //计算每块奶酪直接的距离
	for(int i=0;i<=n;i++){
		for(int j=i+1;j<=n;j++) a[i][j]=a[j][i]=distance(i,j);
	}
    //初始化每块奶酪的距离
	for(int i=1;i<=n;i++) f[i][1<<(i-1)]=a[0][i];
	for(int k=1;k<(1<<n);k++){
		for(int i=1;i<=n;i++){
			if((k&(1<<(i-1)))==0) continue;    //没走过的路跳过
			for(int j=1;j<=n;j++){
				if(i==j) continue;            //相等直接跳过
				if((k&(1<<(j-1)))==0) continue; //没走过的路跳过
				f[i][k]=min(f[i][k],f[j][k-(1<<(i-1))]+a[i][j]); 
			}
		}
	}
	double ans=f[0][0];
	for(int i=1;i<=n;i++) ans=min(ans,f[i][(1<<n)-1]);
	printf("%.2lf",ans); 
}

dfs(超时)

#include<iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n,flag[20];
double x[20],y[20],a[20][20];
bool vis[20];
double Min=0x3ffffffffffff;
void dfs(int k,double d){
	if(d>Min) return ;
	if(k>n){
		Min=d;
		return;
	}
	for(int i=1;i<=n;i++){
		if(vis[i]==0){
			vis[i]=1;
			flag[k]=i;
			dfs(k+1,d+a[flag[k-1]][flag[k]]);
			vis[i]=0;
		}
	}
} 
int main(){
	cin>>n;
	x[0]=y[0]=0;
	for(int i=1;i<=n;i++) {
		cin>>x[i]>>y[i];
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			a[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
		}
	} 
	dfs(1,0.0);

	printf("%.2lf\n",Min);
}

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

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

相关文章

短视频SDK,支持Flutter跨平台框架,加速产品上线进程

在数字内容爆炸式增长的今天&#xff0c;短视频已成为连接用户、传递情感、展现创意的重要桥梁。为助力开发者快速融入这股潮流&#xff0c;美摄科技匠心打造了一款专为Flutter框架优化的短视频SDK解决方案&#xff0c;旨在降低技术门槛&#xff0c;加速产品迭代&#xff0c;让…

商标直接注册初审通过提高的注意!

近日下了一批商标注册申请初步审定公告通知书&#xff0c;普推知产商标老杨发现其实许多商标名称申请在前&#xff0c;经过专业检索查重&#xff0c;基本上就知道通过率如何&#xff0c;虽然是一个预判&#xff0c;但是对于有经验的商标代理人员来说&#xff0c;预估七成基本判…

HTML - 简易版打字练习

1. 赛博朋克风格的视觉设计 颜色与渐变&#xff1a;通过linear-gradient设置了背景的颜色渐变&#xff0c;使用高饱和度的霓虹色彩&#xff08;如橙色、绿色和蓝色&#xff09;来营造赛博朋克的视觉效果。这种配色方案是赛博朋克风格的典型元素。 立体感和阴影&#xff1a;使用…

春秋云镜CVE-2023-38836

打开靶场环境 点击发现一个登陆框&#xff0c;弱口令试一下 发现账号密码为admin,password 随便点击点击 Media发现这里可以上传文件上传木马试试 <?php eval($_POST["wjq"]); ?> 发现不能上传php文件 php内容 修改他的格式 抓包绕过一下 302就可以其实已经…

绘制echarts-liquidfill水球图

文章目录 一、效果图二、步骤1.安装插件2.引入2.主要代码2.素材图片 总结 一、效果图 二、步骤 1.安装插件 npm install echarts npm install echarts-liquidfillecharts5的版本与echarts-liquidfill3兼容&#xff0c;echarts4的版本与echarts-liquidfill2兼容,安装的时候需要…

Spring I

1. IoC & DI ⼊⻔ 1.1 Spring 是什么&#xff1f; 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的…

C++中的搜索二叉树模拟实现代码

包含的功能&#xff1a;插入、删除、查找、中序遍历&#xff08;排列大小&#xff09; 代码&#xff1a;

Linux 内核源码分析---proc 文件系统

proc文件系统 进程数据文件系统&#xff08;process data filesystem, procfs&#xff09;装载在 /proc&#xff0c;缩写为 procFS。 proc 文件系统是一种虚拟文件系统&#xff0c;其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统&…

WPF篇(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件&#xff0c;属性以及使用案例&#xff0c;从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮&#xff08;Button&#xff09;、单选(RadioButton)、复选&#xff08;CheckBox&#xff09;、文本框…

【JavaEE初阶】JUC(java.uitl.concurrent)的常见类

&#x1f334;Callable 接口 之前讲到Runnable接口&#xff0c;用于描述一个任务&#xff0c;通过Runnable中的run方法来体现的&#xff0c;但是描述的任务没有返回值&#xff08;run方法是返回void&#xff09;&#xff0c;此处的Callable接口与Runnable接口类似&#xff0c;C…

LLVM理论篇之编译器前端

1、简述 LLVM前端通过对源程序的预处理&#xff0c;构成源程序的字符流扫描与分解&#xff0c;将单词序列提取为各类语法短语&#xff0c;生成抽象语法树&#xff0c;最终转换为中间代码。编译器前端包含的这几个过程如下&#xff1a; &#xff08;1&#xff09;预编译 &…

【python】实现对文件夹中的图像连续重命名方法

import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件&#xff08;假设都是.jpg格式&#xff09;image_files [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f)) and f.endswith(".jpg"…

性能测试工具LoadRunner

前言&#x1f440;~ 上一章我们介绍了性能测试的一些基本概念&#xff0c;重要的是性能测试的各项指标&#xff0c;今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么&#xff1f; LoadRunner安装 LoadRunner脚本录制 1.录…

振弦式钢筋计的主要应用领域有哪些?

在现代工程建设中&#xff0c;钢筋作为重要的结构材料&#xff0c;其应力状态直接关系到工程结构的安全性和稳定性。因此&#xff0c;对钢筋应力的实时监测成为了保障工程质量的关键环节。振弦式钢筋计作为一种高精度、稳定性好的应力监测仪器&#xff0c;在桥梁、建筑、隧道等…

pg一些常用语句记录

查看数据库大小 pg_size_pretty:将数据库用量展示为KB、MB、GB等样式,查看更直观查看具体某个数据库的大小 select pg_size_pretty(pg_database_size(postgres)); 查看所有数据库的大小 select pg_database.datname, pg_size_pretty (pg_database_size(pg_database.datnam…

Sqli-labs-master靶场--布尔盲注

目录 1、布尔盲注 2、布尔盲注的流程&#xff08;以靶场less-8为例&#xff09; 2.1输入id尝试是否存在注入点 2.1.1通过以上尝试&#xff0c;联想到可能是布尔盲注 2.2猜测数据库长度 2.3获取数据库名 2.3.1python脚本获取 代码&#xff1a; 获取结果为&#xff1a; …

后期调色学习笔记

关于调色曲线的学习&#xff1a; 学习链接&#xff1a;一看就懂的曲线调色教程【手机摄影后期】_哔哩哔哩_bilibili 从左向右就是由暗部越来越到亮部 越靠近右侧的越是亮部

机械学习—零基础学习日志(数学基础汇总1)

零基础为了学人工智能&#xff0c;正在艰苦的学习 我比较推荐&#xff0c;《三个月从零入门深度学习&#xff0c;保姆级学习路线图》的整体学习思路&#xff0c;但因为数学基础太差&#xff0c;而且针对所需的数学系统知识&#xff0c;我依然没有很明确的学习方向。 所以直接…

杀手级的AI LLM产品还有多久面世

AI产品落地&#xff1a;Killer App依然缺席的原因与未来展望 &#x1f680; 在当今科技领域&#xff0c;人工智能&#xff08;AI&#xff09;无疑正处于一个快速发展的阶段。尽管如此&#xff0c;关于AI产品的实际应用和市场落地&#xff0c;仍然存在诸多挑战。本文将探讨当前…

使用 Matplotlib 绘制折线图

使用 Matplotlib 绘制折线图 数据可视化是数据分析的重要组成部分&#xff0c;通过图表&#xff0c;我们可以更直观地理解数据背后的趋势和模式。Matplotlib 是 Python 最基础也是最常用的绘图库之一&#xff0c;非常适合初学者。本文将带你从零开始&#xff0c;逐步创建和自定…