改善Box Factory解决方案

时间:2012-07-22 03:35:50

标签: algorithm

Box Factory是Google Code Jam 2012第1C轮中的一个问题。它类似于最长公共子序列问题,并且它们给出了O(n^4) solution。但是,在分析结束时,它表示另一项改进可以再次将其减少为O(n ^ 3)。我想知道可以对解决方案进行哪些优化。

1 个答案:

答案 0 :(得分:3)

O(n ^ 4)算法

动态编程方法解决了f [x] [y] =使用第一批x个盒子和第一批y玩具可以放在盒子里的玩具的最大数量。

它通过考虑在+ 1和x之间运行的最后一种类型的盒子以及在b + 1和y之间运行的最后一种类型的玩具来解决这个问题。

O(n ^ 4)算法遍历a和b的所有选择,但我们可以通过仅考虑a和b的临界值来简化。

O(n ^ 3)算法

关键点在于,如果我们有a,b这样我们有更多的盒子而不是玩具,那么就没有必要改变它来获得更多的盒子(因为这将永远不会帮助我们制造更多的产品)。同样地,如果我们有更多的玩具而不是盒子,那么我们可以跳过考虑b的所有情况,这将给我们更多的玩具。

这表明内部循环的O(n)算法,其中我们在具有更多玩具和具有更多盒子之间追踪a,b的边界。这很简单,因为我们可以从a = x-1和b = y-1开始,然后根据我们当前是否有更多的玩具或盒子来减少a或b。 (如果相等则可以减少两者。)

算法的每一步都将a或b减1,因此这次迭代需要x + y步,而不是原始方法的x * y步。

需要对x,y的所有值重复它,因此整体复杂度为O(n ^ 3)。

其他改进

进一步的改进是存储每种类型的上一次运行的索引,因为这将允许将算法的几个步骤折叠成单个移动(因为我们知道我们的分数只有在我们回到一个正确类型的运行)。但是,在最坏的情况下(相同类型的所有盒子/玩具),这仍然是O(n ^ 3)。

另一个实际改进是合并任何在连续位置类型相同的运行,因为这可以显着简化旨在揭示先前改进中最坏情况行为的测试用例。