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

胖虎的菜品

题目描述

胖虎惊喜地发现了有N个窗口有他最喜欢吃的菜(其实都喜欢?),但是他想在移动最短距离(毕竟走多了也是会累的)的情况下吃到所有他喜欢吃的菜品,饥饿的他已经没有力气写出代码来计算自己的最佳方法了,所以他找到了你,来帮他解决这个问题。现在给你N个窗口及窗口的坐标,请输出胖虎所要移动的最小距离总和。
胖虎一开始在(0,0)点处。

输入

第一行一个正整数n(1≤n≤13) 。
接下来每行2个实数,表示第i块窗口的坐标。
两点之间的距离公式为\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

输出

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

样例输入
4
1 1
1 -1
-1 1
-1 -1
样例输出
7.41
思路分析

旅行商问题(TSP)的变种问题,采用状态压缩DP。

1.读入n个点的横纵坐标(0-based indexing)。

2.计算n个点相互之间的直线距离,点i与点j之间的直线距离就是dist[i][j]。

3.dp[s][i]表示在状态s下,到达i点的最短距离。s是一个二进制数(位表示访问状态),如0b1011,包含0,1,3(11=1\times2^0+1 \times 2^1+0\times2^2+ 1\times 2^3)。记得初始化dp数组为较大的数。

当s=2^i(0\leqslant i\leqslant n-1)时,dp[s][i]就等于起点(0,0)到点i的直线距离。

4.外层循环遍历状态s(1\leqslant s\leqslant 2^n-1),内层循环遍历n个点(0\leqslant i\leqslant n-1),如果状态s包含点i,计算前一个状态s0=s^(1<<i)(即去掉点i的状态),遍历s0中所有可能的j点(0\leqslant j\leqslant n-1),如果s0包含j点,则更新dp[s][i]=min(dp[s0][j]+dist[i][j],dp[s][i])。

5.遍历n个点,比较dp[1<<n-1][i],找到经过所有点后、以点i为终点的最短路程。

代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
double x[14],y[14],res=1e9,dist[14][14];
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;for(int i=0;i<n;i++){cin>>x[i]>>y[i];}for(int i=0;i<n;i++){for(int j=0;j<n;j++){dist[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));dist[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));}}vector<vector<double>>dp(1<<14,vector<double>(14,1e9));for(int i=0;i<n;i++){dp[1<<i][i]=sqrt(x[i]*x[i]+y[i]*y[i]);}for(int s=1;s<(1<<n);s++){for(int i=0;i<n;i++){if(s&(1<<i)){int s0=s^(1<<i);for(int j=0;j<n;j++){if(s0&(1<<j)){dp[s][i]=min(dp[s0][j]+dist[i][j],dp[s][i]);}}}}}int full=(1<<n)-1;for(int i=0;i<n;i++){res=min(dp[full][i],res);}cout<<fixed<<setprecision(2)<<res;return 0;
}

http://www.dtcms.com/a/324646.html

相关文章:

  • 一劳永逸解决Mayplotlib绘图中中文字体显示乱码的问题
  • 嵌入式软件分层架构的设计原理与实践验证(有限状态机理解及结构体封装理解)
  • 进度、质量、安全的关系随笔
  • 力扣面试150(52/150)
  • NY155NY170美光固态闪存NY175NY184
  • Zabbix优化指南:提升监控效率与性能
  • Pytorch深度学习框架实战教程-番外篇07-Pytorch优化器详解和实战指南
  • 机器学习——DBSCAN
  • 【人工智能99问】LLaMA的训练过程和推理过程是怎么样的?(22/99)
  • 【GPT入门】第43课 使用LlamaFactory微调Llama3
  • AI大模型提示词工程完全指南:从入门到精通
  • 【自用】JavaSE--IO流(二)--缓冲流、转换流、打印流、数据流、序列化流、IO框架
  • 硬件开发_基于STM32单片机的智能电梯系统
  • 【RocketMQ 生产者和消费者】- ConsumeMessageConcurrentlyService 并发消费消息
  • 自然语言处理入门路线-实践篇
  • AutoCAD 2026 的主要功能
  • 如何选择适合自己电商业务的 API?​
  • 解决RuoYi-Cloud项目ruoyi-system模块启动失败问题以及Naco容器部署问题
  • 【21】OpenCV C++实战篇——OpenCV C++案例实战二十七《角度测量》
  • SpringAI智能航空助手实战<Demo>
  • 《算法导论》第 17 章 - 摊还分析
  • XGBoost 与 GBDT 的比较:改进与性能提升
  • MATLAB绘制水的蒸汽压曲线(Antoine方程)
  • GitHub上为什么采用Gradle编译要多于Maven
  • DBSACN算法的一些应用
  • 【算法】图的 深度优先搜索(DFS)与 广度优先搜索(BFS)
  • Stream流应用
  • 学习分库分表的前置知识:高可用系统架构理论与实践
  • Java进阶之单列集合Set接口下的通用方法
  • Design Compiler:布图规划探索(ICC II)