我在试图解决这个问题时有点卡住了。混淆的主要来源是不知道何时移除盒子。

这是我的方法:

我逐列查看容器。如果起始框最上面的框是空的,而目标框不是空的,那么我知道添加那个框。如果反之亦然,我知道要移除顶盒。我认为当两个位置都有一个盒子但不同时我必须交换。然而,我的问题出现在某些情况下,删除底部的框会将所有内容向下移动并使其更像目标框。或者可能移除中间的一个或移除两个,一个在底部,一个在中心。我怎么知道什么时候取下盒子?我可以删除所有组合,看看哪个组合最接近目的地,但这似乎效率不高。

我也可能认为这是一个明显的动态编程问题,这让我无法理解。任何帮助,将不胜感激

最佳答案

您已经将问题简化为一次考虑一列,所以让我们从这个开始。

与其考虑列中可能发生的特定操作,不如让我们看看整个过程。
最初,我们有给定的列。
最后,我们得到了结果列。
结果列中给定列的剩余部分是什么?
它是给定列的 子序列 (因为我们可以从任何地方删除一个框),它转移到结果列的 前缀 (“前缀”如“位于底部”,因为我们可以添加新框仅在最初存在的内容之上)。

自然地,我们希望最大化这个序列的长度(子序列或前缀,取决于你在哪里看)。
这确实看起来像一个动态规划问题,类似于 edit distancelongest common subsequence
也许你会想从这一点上自己计算出细节。
祝你好运!

关于algorithm - 堆叠盒子算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22815796/

10-12 20:09