动态编程问题

时间:2011-07-31 23:32:06

标签: algorithm

马戏团正在设计一个由彼此站立的人组成的塔式例程 肩膀。出于实际和美学的原因,每个人必须比他或她下面的人更短更轻。考虑到马戏团中每个人的身高和体重,编写一种计算最大可能人数的方法 在这样一座塔楼里。

示例:
输入(ht,wt):( 65,100)(70,150)(56,90)(75,190)(60,95)(68,110)
输出:最长的塔长6,包括从上到下:(56,90)(60,95)(65,100)(68,110)(70,150)(75,190)

有人向我建议如下: 它可以按如下方式完成:

  1. 按重量递减顺序对输入进行排序,找到最长的降序序列。
  2. 按高度递减顺序对输入进行排序,找到最长的减重序列。
  3. 取最大值1和2.

    我不明白为什么我们需要同时执行第1步和第2步。不能只做1并找到答案。如果没有,请举例说明只做第1步没有给出答案?

5 个答案:

答案 0 :(得分:4)

1和2的结果必须相同。它们中的一个不可能更短,因为在一个解决方案中,元素的高度和重量都在下降,所以如果它满足1或2它也会满足另一个,如果它会更短,它就不会是最长的。

答案 1 :(得分:2)

您可能需要说一些关于重量和重量的信息。高度都是独一无二的。 否则,如果

A is (10, 10) // (w, h)
B is ( 9, 10)
C is ( 9,  8)

然后两种方法都没有得到正确答案! C显然可以站在A的肩膀上。


修改

这两种方法都不够好!

所有重量和示例的示例高度独特:

A : (12, 12)
B : (11,  8)
C : (10,  9)
D : ( 9, 10)
E : ( 8, 11)
F : ( 7,  7)

两种方法都给出了2的答案,但是塔可以至少具有3种高度的高度:

  • A在底部,
  • 然后是B,C,D或E中的任何一个,
  • 然后F在顶部。

我认为需要更严格的输入数据规则才能使这个问题能够通过给定的方法解决。

答案 2 :(得分:1)

你是完全正确的。只做一个方向就足够了。

使用子序列的最大属性可以轻松证明。我们假设值的一边(比如左边)是有序的,并且取右边最长的下降子序列。我们现在执行另一个操作,命令右边并从左边开始后续操作。

如果我们到达的列表比第一个更短或更长,我们发现我们已经达成了矛盾,因为该子序列在第一个操作中以相同的相对顺序排序,因此我们可以找到一个更长的下降子序列,与我们所采用的那个是最大的假设相矛盾。同样,如果它更短,则参数是对称的。

我们得出结论,仅在一侧找到最大值将与反向有序操作的最大值相同。

值得注意的是,我没有证明这是问题的解决方案,只是片面算法等同于双面版本。尽管证明这是正确的证明几乎相同,但假设存在更长的解,并且它与子序列的最大值相矛盾。这证明没有更长的时间,并且看到算法产生的每个解决方案都是有效的解决方案是微不足道的。这意味着算法的结果都是> =解决方案和< =解决方案,因此它就是解决方案。

答案 3 :(得分:0)

它没有任何区别。并且无需预先排序,因为您最终会使用相同的图表进行搜索。

答案 4 :(得分:0)

据我所知,这是与Box stacking problem相同的问题:

另外:http://people.csail.mit.edu/bdean/6.046/dp/