Algorithm 使用动态规划找到最适合一组数据点的多边形链

Algorithm 使用动态规划找到最适合一组数据点的多边形链,algorithm,dynamic-programming,Algorithm,Dynamic Programming,问题如下: 给定n个点的序列p_1=(x_1,y_1),…,p_n=(x_n,y_n)并按其x坐标(即x_1

问题如下:

给定n个点的序列p_1=(x_1,y_1),…,p_n=(x_n,y_n)并按其x坐标(即x_1找到一条从p1到pn的多边形链,该链具有从左到右的k条边,使点到链的垂直距离之和最小化。设计了一个动态规划算法,在O(n^3)时间内求解该问题。计算点p_a+1,…,的垂直距离之和的方法,p_b-1至线路通过 p_ap_b。由f(a,b)给出

因为我很难写一个例子来测试,所以我不知道我的答案是否正确

答案如下:

首先,我定义了C[I,j]=多边形链在pi处的末端,j边是垂直距离的最小和。答案应该是C[n,k]

对于基本情况,当j>=I时,我定义C[I,0]=0和C[I,j]=+无穷大

对于递归公式,我定义了C[I,j]=最小值(1
我的回答有什么问题吗?谢谢。

示例,其中最好为链使用非
p
(一组
p_i
)中的点

P = {(0, 0), (1, 1), (3, 1), (4, 0)}
k = 2

        + (2,2)

    * (1,1) * (3,1)

* (0,0)        * (4,0)
对于点位于
p
中的链,有两种可能性,都具有
f(1,4)=2/3
。将
(2,2)
作为链点,得到
f(1,4)=0

链点位于
p
的问题的无限制解决方案可能很难用DP方式描述。它看起来更像是有很多约束的回归问题

我假设在这个问题中,链点应该来自
p

更新

低级递归和原始的一样,就像j_random_hacker提到的

我认为最好定义稍微不同的函数。将
C(a,b,e)
定义为具有
e
边的点
p_a
p_b
之间链的最小成本。我们问题的答案是
C(1,n,k)

可以使用不同的递归。这一条是由最后一条边的“长度”决定的:

C(a, b, k+1) = min( C(a, c, k) + C(i, b, 1) ), for i in a+k, b-1

你忘了定义函数,所以我看不出真正的问题。您只是想验证您的重复是否正确吗?很抱歉没有函数定义,因为我无法上载图像。是的,我的重复对于以下问题是正确的:我们想找到一个从p1到pn的多边形链,具有从左到右的k条边,最小化点到链的垂直距离之和。然后至少在问题中发布链接或注释,以便我们可以为您编辑它现在可用,对此我很抱歉。+1作为你的反例:)但是我认为你的递归没有帮助——我认为它计算的东西与原始递归相同,但速度较慢,因为它使用了更多的参数。@j_random_hacker你是对的,这与原始递归完全相同。只有两种类型的C()出现:C(1,i,k)(在原来的C[i,k]中)和C(i,b,1)(f(i,b))。C(a,b,e)的定义提供了不同类型的递归:从开始(像原始的),从结束(相反的)。。。这在最后并没有太大帮助:-/
C(a, b, k+1) = min( C(a, c, k) + C(i, b, 1) ), for i in a+k, b-1