寻找动态算法以确定最佳序列

时间:2012-02-21 20:02:30

标签: algorithm dynamic-programming

这是课堂上的作业问题,我想知道我是否能得到一些帮助。

问题在于,有一位老人。他在公园里。公园由长c_1, c_2, c_3, ....c_n个长椅组成,其中c_1最接近老人,而c_n是老人想要坐的最后一个长凳。

理想情况下,他可以在不使用任何帮助的情况下行进120英尺。然而,他旅行的次数超过120英尺,他会很容易疲倦,而且旅行的次数减少,坐在板凳上和起床时会有时间不利。因此,对于每次步行,步行的惩罚将是(120-x)^4,其中x是他在最后一次在板凳上休息后到目前为止所走过的步行的长度。

如果长凳相距120英尺,那么他就不会受到任何惩罚,因为他可以在他遇到的每个替补席上休息,这将使120英尺的旅行,罚款0。显然,他可以跳过替补席,如果他认为他到目前为止还没有走过120英尺,而只有10或20英尺。

目标是找到一种算法,使用动态编程和时间复杂度很高的方式给予他最小的整体惩罚。无论他多少次在替补席上休息,但要找到一个能够给出最低罚分的替补名单。

您认为有可能实现比O(n ^ 2)时间复杂度更好的效果吗?我认为这与硬币问题或美式足球得分问题非常相似,但是对于两个长椅之间的每次单独旅行的“(120-x)^ 4”罚款令我头疼。

2 个答案:

答案 0 :(得分:0)

自从我用动态编程完成任务以来已经有一段时间了,但我会采取刺激措施。

P[i]成为从工作台c_i开始的最低惩罚。

cost(i)成为从工作台c_i开始到c_n的惩罚。对于i=n,这将为0,否则为(120-x)^4x为长凳之间的距离。

for i = n to 1
    P[i] = cost(i)
    for j = i + 1 to n
        P[i] = min(P[i], P[j])

我们从最后一个替补席向后工作,检查走到最后一个替补席和走到当前替补席和最后一个替补席之间的任何替补席之间的最低费用。

这以O(n ^ 2)时间复杂度运行。

答案 1 :(得分:0)

另一个解决方案是构建一个图形,每个椅子作为一个节点。节点i和j(ij)如果它们之间的距离小于或等于120英尺。根据惩罚函数对每条边进行加权。

现在找到起始节点和结束节点之间的最短距离。

如果图形稀疏(即长凳间距稀疏),则可以得到O(nlogn),假设边数为O(n)。