最大化回车算法#(贪心?)

时间:2013-11-26 05:05:10

标签: algorithm greedy

我最近有一个面试问题如下: 我们给出了一个单词列表,我们想要格式化它们以最大化回车次数,同时保持每行的字母数#在一个范围内。

例如,我们想要每行5到10(含)个字母的范围,一个解决方案就是:

hello (5)
cat (3)

另一个是:

hello cat (9) <- 1 for a space

所以第一个解决方案更好,因为我们有1个回车而第二个是0。

如果单词不合适,则必须将其放在新行上。例如:

hello (5)
people (6)

直观地说,这似乎是一个贪婪的算法问题,我们只要满足每行限制的最小字母就会返回。然而,这似乎太简单了,我现在开始怀疑自己,但我无法想出一个贪婪不是最好的反例。

1 个答案:

答案 0 :(得分:1)

如果要按照出现的顺序放置单词,那么简单的贪婪方法应该是最佳的,因为没有理由不在序列中尽早放置回车符。

如果允许您更改单词的顺序,那么这是一个更难的问题,然后可以应用以下方法。

按字母数的降序对单词进行排序。

为长度为&gt; = 5的单词分配一行。

对于长度<1的单词。 5,它是一个反向多仓垃圾箱背衬问题其中:
垃圾箱的最小容量为5,最大容量为10 您必须将单词放在容器中,以便最大化容器的数量。

这至少是一个NP完全问题,但“我认为”(更多是因为在访谈中被问到)一个动态编程公式可以被认为是在伪多项式时间(如背包问题)中解决它。

编辑: IMO贪婪算法适用于最大容量至少等于最小容量的两倍的情况,如本例所示。