使用动态编程查找最适合一组数据点的多边形链

时间:2014-04-21 15:16:13

标签: algorithm dynamic-programming

问题如下:

给定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)给出。

enter image description here

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

答案如下:

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

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

对于递归公式,我定义C [i,j] = minimum(1< p< i){C [p,j-1] + f(p,i)}

我的回答有什么问题吗?谢谢。

1 个答案:

答案 0 :(得分:1)

最好使用不在Pp_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)定义为具有p_a边缘的点p_be之间链的最低成本。我们问题的答案是C(1, n, k)

C(a, b, 1) = f(a,b)
C(a, a+i, i) = 0
C(a, b, k) = inf, k > b-a

可以使用不同的递归。这个是最后一个边缘的“长度”:

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