将一行对象拆分为

时间:2014-12-04 21:20:50

标签: algorithm dynamic-programming

我无法快速解决这个问题。我有一个迭代O(M*N^2)动态编程解决方案,但它看起来太慢了。

问题在于:

在一行中给出N个字符(“a”或“b”),我们会尝试在字符上放置M个不重叠的遮阳伞,以便所有遮阳伞涵盖所有人物。有两种类型的伞:“a”伞和“b”伞。放置在[i,j]范围内的“a”伞的分数等于该范围内的“a”字符数。 “b”伞以类似的方式运作。当从左到右阅读时,雨伞必须交替出现(这很明显,因为你可以将相同类型的相邻雨伞组合起来。)

例如,如果N=8M=2且字符为abaabbab,则最佳解决方案是从[0,3]和“b”放置一个“a”保护伞“来自[4,7]的保护伞。

我的解决方案是DP,其中maxscore(index, used, type)是使用0...index遮阳伞覆盖used的最高分数,最后一个伞类型为type。有N*M*2个状态和O(N)转换(考虑前一个保护伞的所有可能结束),这使得它O(M*N^2)并且运行速度太慢。是否有更快的DP算法?

1 个答案:

答案 0 :(得分:0)

我怀疑你当前的递归是根据所有先前位置的相反类型的maxscore值计算maxscore。这给出了每个状态的O(N)计算。

但是,您可以通过简单地考虑是否开始新的保护伞或继续前一个保护伞并选择这两个选项中最好的一个来将此减少为每个州的O(1)计算。

如果我们开始新的保护伞,则如果当前字符与类型匹配,则分数为maxscore(index-1,used-1,1-type)加1。

如果我们继续前一个,那么如果当前字符与类型匹配,则分数为maxscore(index-1,used,type)加1。