1

我正在尝试回顾一些动态编程的笔记和示例,但我很难弄清楚它是如何工作的。我将发布问题,然后是我遇到的困难:

给定一系列点 p1= (x1,y1),...,pn=(xn,yn) 从左到右排序(即 x1 < x2 < ... < xn)和一个介于 1 和 n 之间的数字 k ,找到一条从 p1 到 pn 的多边形链,其 k 条边从左到右,最小化点到链的垂直距离之和。设计在 O(n^3) 时间内解决问题的动态规划算法。设置子问题,给出所有必要的基本情况,计算递归公式,并为算法编写伪代码。还为我们定义了一个函数 f(a,b) 用于计算垂直差,所以我不必担心实现它。我可以将它用作 f(a,b)

我认为子问题应该这样划分:

C[i,j] = 从 p1 到具有 j 条边的 pi 的多边形链,最小化垂直距离的总和。

然后答案是:C[n,k]

基本情况:C[i,0] = 0

现在我在提出递归公式时遇到了一些困难。我的第一个问题,我是否正确分解了子问题?这个问题给出了一个暗示,让我看起来像我一样,但我不是 100% 确定。如果我是,关于如何继续推导递归公式的任何提示?

感谢您的帮助。

4

1 回答 1

1

您的子问题是正确的,但我认为对公式稍作改动可以帮助您得出公式:

而不是C(i, j)意味着从 1 到 i 的任何链,具有 j 边,而是专门表示“以 i 结尾的链”。然后,要为您确定答案,C(i, j)只需尝试最后一条边开始的所有可能性。

那么答案可能是所有的最佳答案C(i, k)

于 2012-07-10T21:32:51.043 回答