双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。

旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程。

这个解的一般形式为NP的(在多项式时间内能够求出)

J.L. Bentley 建议通过仅仅考虑双调旅程(bitonictour)来简化问题,这样的旅程即为从最左点開始。严格地从左到右直至最右点,然后严格地从右到左直至出发点。

下图(b)显示了相同的7个点的最短双调路线。在这样的情况下。多项式的算法是可能的。其实,存在确定的最优双调路线的O(n*n)时间的算法。

上图中,a是最短闭合路线。这个路线不是双调的。

b是最短双调闭合路线。



求解过程:

(1)首先将各点依照x坐标从小到大排列,时间复杂度为O(nlgn)。

(2)寻找子结构:定义从Pi到Pj的路径为:从Pi開始,从右到左一直到P1,然后从左到右一直到Pj。在这个路径上,会经过P1到Pmax(i,j)之间的全部点且仅仅经过一次。

在定义d(i,j)为满足这一条件的最短路径。

我们仅仅考虑i>=j的情况。

同一时候,定义dist(i,j)为点Pi到Pj之间的直线距离。

(3)最优解:我们须要求的是d(n,n)。

关于子问题d(i,j)的求解。分三种情况:

A、当j < i - 1时,d(i,j) = d(i-1,j) + dist(i - 1,i)。

由定义可知,点Pi-1一定在路径Pi-Pj上,并且又因为j<i-1,因此Pi的左边的相邻点一定是Pi-1.因此能够得出上述等式。

B、当j = i - 1时,与Pi左相邻的那个点可能是P1到Pi-1总的不论什么一个。因此须要递归求出最小的那个路径:

d(i,j) = d(i,i-1) = min{d(k,j) + dist(i,k)},当中1 <= k <= j。

C、当j=i时,路径上最后相连的两个点可能是P1-Pi、P2-Pi...Pi-1-Pi。

因此有:

d(i,i) = min{d(i,1)+dist(1,i),...,d(i,i-1),dist(i-1,i)}.。

參考

小记:这题之前分析是哈密顿回路。旅行商问题即是。

可是没去百度了,如今百度出来了。參考

2014年百度之星程序设计大赛 - 资格赛 第二题 Disk Schedule的更多相关文章

  1. 2014年百度之星程序设计大赛 资格赛第一题 (longlong)

    解题思路: 只要看(A-V)*K 这个公式的更新值是否大于等于A ,大于的话继续循环,否则报错 注意一点,数据会爆int WA代码: #include<stdio.h> int main( ...

  2. 2014年百度之星程序设计大赛 - 资格赛 第一题 Energy Conversion

    小记:long long %I64d 代码: #include <iostream> #include <stdio.h> #include <string.h> ...

  3. hdu 4825 Xor Sum (建树) 2014年百度之星程序设计大赛 - 资格赛 1003

    题目 题意:给n个数,m次询问,每次给一个数,求这n个数里与这个数 异或 最大的数. 思路:建一个类似字典数的数,把每一个数用 32位的0或者1 表示,查找从高位向底位找,优先找不同的,如果没有不同的 ...

  4. 2014年百度之星程序设计大赛 - 资格赛 1004 Labyrinth(Dp)

    题目链接 题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. 2014年百度之星程序设计大赛 - 资格赛 第三题 Xor Sum

    小记:艹蛋呢, 取long long的低30,32,34位都WA, 取31位才AC. .. 思路:依据求数组中两个数异或最大值.參考 代码: #include <stdio.h> #inc ...

  6. 2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景.磁盘有 ...

  7. 2014年百度之星程序设计大赛 - 资格赛 1001 Energy Conversion

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/sr19930829/article/details/26003661 Energy Conversi ...

  8. hdu 6082 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛 - 资格赛 )

    度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

随机推荐

  1. Android 应用程序签名

    本文主要介绍Android应用程序签名的相关理论知识以及怎样公布Android应用程序. 1.签名的概念 为大家所熟知的日常生活中的签名,它是代表某个人的特殊标记,用于唯一标识某个人.而Android ...

  2. nodejs安装不了和npm安装不了的解决方法

    http://caibaojian.com/nodejs-roll-back.html

  3. Java基础07 包

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经写了一些Java程序.之前的每个Java程序都被保存为一个文件,比如Tes ...

  4. Ubuntu 挂载ISO文件的方法

    1.在终端中输入:sudo mkdir /media/iso 在/media下生成一个iso文件夹用来挂载iso文件2.然后输入:sudo mount -o loop /home/X/X/XXXX.i ...

  5. Oracle多表的简单查询

    Oracle多表的简单查询 .多表查询 多表查询是指基于两个和两个以上的表或是视图的查询. 问题:显示雇员名,雇员工资及所在部门的名字[笛卡尔集]? select t.ename,t.sal,t1.d ...

  6. linux下crontab的使用方法

    <span style="font-size:14px;">在Linux中任务可以被配置在指定的时间段.指定的日期.或系统平均载量低于指定的数量时自动运行. cront ...

  7. State Design Pattern 状态设计模式

    设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就非常easy了. # ...

  8. 用内存流 文件流 资源生成客户端(Delphi开源)

    正文:很多木马生成器就是用的内存流和文件流生成客户端的,废话不多说了,代码如下: unit Main; interface usesWindows, Messages, SysUtils, Varia ...

  9. 基于visual Studio2013解决C语言竞赛题之1076放鞭炮

        题目 解决代码及点评 /************************************************************************/ /* ...

  10. 定义自己的仪表板DashBoard - -kankanstyle

    既然做了奶站软件,需要使用的仪表板,显示质量数据 public class MDashboard extends ImageView { private Bitmap mPointerBitmap; ...