P1523 旅行商简化版

题目背景

欧几里德旅行商\((Euclidean Traveling Salesman)\)问题也就是货郎担问题一直是困扰全世界数学家、计算机学家的著名问题。现有的算法都没有办法在确定型机器上在多项式时间内求出最优解,但是有办法在多项式时间内求出一个较优解。

为了简化问题,而且保证能在多项式时间内求出最优解,\(J.L.Bentley\)提出了一种叫做\(bitonic\) \(tour\)的哈密尔顿环游。它的要求是任意两点\((a,b)\)之间的相互到达的代价\(dist(a,b)=dist(b,a)\)且任意两点之间可以相互到达,并且环游的路线只能是从最西端单向到最东端,再单项返回最西端,并且是一个哈密尔顿回路。

题目描述

著名的\(NPC\)难题的简化版本

现在笛卡尔平面上有\(n(n<=1000)\)个点,每个点的坐标为\((x,y)\)(\(-2^{31}<x,y<2^{31}\),且为整数),任意两点之间相互到达的代价为这两点的欧几里德距离,现要你编程求出最短\(bitonic\) \(tour\)。

输入输出格式

输入格式:

第一行一个整数\(n\)

接下来\(n\)行,每行两个整数\(x,y\),表示某个点的坐标。

输入中保证没有重复的两点,

保证最西端和最东端都只有一个点。

输出格式:

一行,即最短回路的长度,保留\(2\)位小数。

输入输出样例

输入样例#1:

7
0 6
1 0
2 3
5 4
6 1
7 5
8 2

输出样例#1:

25.58

说明

来源 \(Source\)

《算法导论(第二版)》 \(15-1\)


评成绿题稍微有一点低,这个题目的思维要求还是比较高的。

这里利用到一个重要的思想:对于一个有确切起点和终点的回路,其路径情况,可以认为是同一个位置出发的两个点同时向前推进,类似的题目可以参考NOIP2008—传纸条

所以不要被这个题目的题面欺骗。实际上题目问的,就是从一个起点出发的,具有相同终点的两条路径的最小总长度!

做法可以认为是一类套路,如下:

设\(F[i][j]\)为从最左侧的起点出发,一个点走到\(i\),一个点走到\(j(i>j)\),且所有\(i\)以内的点全部被走过的最短路径。

  • \(i=j+1\) 时:\(F[i][j]\)可以由\(F[j][k],k∈[1,j)\)转移得到,原因如下图
  • \(i>j+1\)时,走在前面的人上一步一定是\(i-1\),所以本情况一定由\(F[i-1][j]\)转移而来。

总复杂度\(O(n^2)\),思维难度还是有的。

\(Code:\)

//P1523 100pts
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1e50
#define MAXN 1010
#define dbl double
using namespace std;
struct node{
dbl x;
dbl y;
bool operator<(const node &rhs)const{
return x<rhs.x;
}//按照纵坐标从左往右排序
}arr[MAXN];
int n;
dbl f[MAXN][MAXN];
inline dbl dis(int x,int y){
return hypot(fabs(arr[x].x-arr[y].x),fabs(arr[x].y-arr[y].y));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lf%lf",&arr[i].x,&arr[i].y);
}
sort(arr+1,arr+1+n);//排序
// for(int i=1;i<=n;++i){
// printf("%lf %lf\n",arr[i].x,arr[i].y);
// }
for(int i=0;i<=1000;++i){
for(int j=0;j<=1000;++j){
f[i][j]=INF;
}
}
f[2][1]=dis(1,2);
// printf("f[2][1]=%lf\n",f[2][1]);
for(int i=3;i<=n;++i){
for(int j=i-1;j>=1;--j){
if(i==j+1){
//刚好是向后一个的节点
for(int k=j-1;k>=1;--k){
f[i][j]=min(f[i][j],f[j][k]+dis(k,i));
}
}else{
f[i][j]=min(f[i][j],f[i-1][j]+dis(i-1,i));
}
}
}
double ans=INF;
for(int i=1;i<=n;++i){
ans=min(ans,f[n][i]+dis(i,n));
}
// printf("\n"); printf("%.2lf\n",ans);
}

洛谷【P1523】旅行商的背包(算法导论 15-1) 题解的更多相关文章

  1. 洛谷P1523 旅行商简化版(DP)

    题目: P1523 旅行商简化版 解析 可以看做是两个人同时从西往东走,经过不一样的点,走到最东头的方案数 设\(f[i][j]\)表示一个人走到i,一个人走到j的最短距离(\(i<j\)) 第 ...

  2. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

  3. 洛谷.1782.旅行商的背包(背包DP 单调队列)

    题目链接(卡常背包) 朴素的多重背包是: \(f[i][j] = \max\{ f[i-1][j-k*v[i]]+k*w[i] \}\),复杂度 \(O(nV*\sum num_i)\) 可以发现求\ ...

  4. 洛谷P1782 旅行商的背包

    传送门啦 这个题不用二进制优化的话根本不行,现学的二进制优化,调了一段时间终于A了,不容易.. 如果不懂二进制优化的话可以去看我那个博客 二进制优化多重背包入口 不想TLE,不要打memset,一定要 ...

  5. P1523 旅行商简化版

    P1523 旅行商简化版 题目背景 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家.计算机学家的著名问题.现有的算法都没有办法在确 ...

  6. 洛谷 P2014 选课(树形背包)

    洛谷 P2014 选课(树形背包) 思路 题面:洛谷 P2014 如题这种有依赖性的任务可以用一棵树表示,因为一个儿子要访问到就必须先访问到父亲.然后,本来本题所有树是森林(没有共同祖先),但是题中的 ...

  7. 洛谷 P3805 【模板】manacher算法

    洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...

  8. 【洛谷P2584】【ZJOI2006】GameZ游戏排名系统题解

    [洛谷P2584][ZJOI2006]GameZ游戏排名系统题解 题目链接 题意: GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在 ...

  9. 洛谷 P4389: 付公主的背包

    题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i ...

随机推荐

  1. Pair Work:电梯调度算法的实现和测试 by 12061171 and 12061168

    结队成员简介: 成员:牛强,学号12061171:刘文乔,学号120611683 我们之所以结对编程以完成所给课设要求,是因为我们互相了解彼此,能够更好更快地完成.下图是我们合作编程时的留影: 牛强是 ...

  2. 《Linux内核设计与实现》第三章读书笔记

    一.进程(任务)描述 1.进程是处于执行期的程序:除了可执行程序代码,还包括打开的文件.挂起的信号.内核内部数据.一个或者多个执行线程等多种资源 线程是在进程活动中的对象:内核调度的对象是线程而不是进 ...

  3. C# wkhtmltopdf 将html转pdf(详解)

    https://www.cnblogs.com/louby/p/905198.html转自,看文章只放了代码看起来云里雾里的,在此做些解析 使用说明: 1.首先呢,得安装下软件,地址下面有链接,文件里 ...

  4. java注解的简单介绍

    什么是注解 1.注解就是Annontation,Annontation是Java5开始引入的新特征,中文名称叫做注解,它提供了一种安全的类似注释的机制,可以起到减少配置的成果,给程序起到辅助性的作用 ...

  5. PAT 1003 我要通过!

    https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192 “答案正确”是自动判题系统给出的最令人欢喜的 ...

  6. Expanded encryption and decryption signature algorithm SM2 & SM3

    Expanded encryption and decryption signature algorithm supports multiple signature digest algorithms ...

  7. Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题

    http://1000hz.github.io/bootstrap-validator/#validator-usage Validated fields By default, the valida ...

  8. Leetcode 125.验证回文串 By Python

    思路 显然一个字符串不止包括字母和数字字符,所以我们可以先提取出来我们要进行比较的字符 还有一个问题是,字母是分大小写的,我们要统一大写或者统一小写,就是规范化 代码 class Solution(o ...

  9. adb is down 的解决方法

    今天装完android Eclipse 之后 ,运行时报出这么个错误 : The connection to adb is down, and a severe error has occured.  ...

  10. 学习Spring Boot:(二十二)使用 AOP

    前言 AOP 1,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.基于AOP实现的功能不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业 ...