Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以给定的最大x速度通过线段的最大y速度 给定一行线段Si,每个都具有坐标席和Yi(对于每一个I,Yi+1大于Yi),并且每个长度B在x方向上,我如何计算最大Y速度通过所有段,其中可以以最大速度V改变x坐标。(对于某些段序列,这可能是不可能的)_Java_Algorithm_Coordinates_Dynamic Programming - Fatal编程技术网

Java 以给定的最大x速度通过线段的最大y速度 给定一行线段Si,每个都具有坐标席和Yi(对于每一个I,Yi+1大于Yi),并且每个长度B在x方向上,我如何计算最大Y速度通过所有段,其中可以以最大速度V改变x坐标。(对于某些段序列,这可能是不可能的)

Java 以给定的最大x速度通过线段的最大y速度 给定一行线段Si,每个都具有坐标席和Yi(对于每一个I,Yi+1大于Yi),并且每个长度B在x方向上,我如何计算最大Y速度通过所有段,其中可以以最大速度V改变x坐标。(对于某些段序列,这可能是不可能的),java,algorithm,coordinates,dynamic-programming,Java,Algorithm,Coordinates,Dynamic Programming,下面是一个示例(段坐标(1,1)、(5,2)、(1,3)和长度3(第二段的图片显示不正确),最大x速度=2): 我会首先将线段排序为增加的Y值,并将具有相同Y值的线段分组在一起。我假设,如果有两个具有相同y值的段,则可以通过其中一个。如果情况并非如此,您可能会将其替换为一个单独的线段,该线段是它们的交点,并按此处所述继续进行,或者如果交点为空,则表示不可能 查看任意线段的最左侧和最右侧之间的差值,以及两个不同Y值之间的最小差值,可以计算两个不同Y值之间最小差值中最左侧值和最右侧值之间的速度。这是

下面是一个示例(段坐标(1,1)、(5,2)、(1,3)和长度3(第二段的图片显示不正确),最大x速度=2):

我会首先将线段排序为增加的Y值,并将具有相同Y值的线段分组在一起。我假设,如果有两个具有相同y值的段,则可以通过其中一个。如果情况并非如此,您可能会将其替换为一个单独的线段,该线段是它们的交点,并按此处所述继续进行,或者如果交点为空,则表示不可能

查看任意线段的最左侧和最右侧之间的差值,以及两个不同Y值之间的最小差值,可以计算两个不同Y值之间最小差值中最左侧值和最右侧值之间的速度。这是一个可能的速度,所以最小可能的速度在这和0之间

现在猜猜速度。对于此速度,您将计算出每个y值处的一系列间隔,这些间隔是可达到的x值。开始时,所有具有最小y值的线段都是可访问的。现在考虑所有组的分段,以增加Y值的顺序。在给定当前速度的情况下,计算从当前间隔集可以到达的分段组中的哪些间隔。这将成为新的可到达间隔集。解决这一问题的一种方法(不一定是最好的方法)是扩大当前可到达间隔集,方法是在两组分段之间的y距离内,用当前最大速度行驶的距离向左和向右填充它们,然后将此扩大的可到达间隔集与新的分段集相交

现在,您可以对速度进行二元切分(从0到您之前计算的最大速度之间开始),以获得刚连接的段的大致速度。事实上,我认为如果我更聪明的话,我可以描述你如何通过线段,不仅计算区间,而且计算区间上的线性函数,这将允许你精确地解决这个问题。事实上,我认为这告诉我,当速度超过最小必要速度时,最后一个Y值处可到达段的总长度在您选择的速度中是分段线性的


但仅仅知道这一点就可以让你做出比二进制切碎更好的猜测。使用迄今为止工作的最小速度的两次猜测,使用可到达段的长度推断出使问题可到达的速度。如果猜测不起作用,则在重试之前,再进行一次二进制切分,以获得迄今为止有效的新的最小速度。

重新表述,我们得到了几个水平线段
[l_i,u_i]×{y_i}
和水平速度
v
并希望找到最大垂直速度
s
,以便存在
x\i∈ [l_i,u_i]
|y_i-y_{i-1}/s≥ |x_i-x_{i-1}/v
,即水平移动的时间不超过垂直移动的时间。这个问题有这样一个LP公式

minimize z (intuitively, z = v/s)
subject to
l_i ≤ x_i ≤ u_i, for all i
x_i - x_{i-1} ≤ |y_i - y_{i-1}| z, for all i
x_{i-1} - x_i ≤ |y_i - y_{i-1}| z, for all i
variables
x_i, for all i
z

单纯形法可以很快解决这个问题。

好的,我明白你的意思,但我无法实现实际的实现。如果能给我一点提示,我将不胜感激。我忘了提一点:s必须至少是1,所有坐标和速度都是整数。