有关string,dp,graph或sth算法的问题

时间:2010-12-11 01:48:41

标签: algorithm string graph dynamic-programming

问题随之而来。

  1. 关于“好”

    1)“ab”很好

    2)A很好=> “a”+ A +“b”很不错

    3)A和B很好=> A + B很不错

  2. 关于“〜”

    1)“ab”〜“ab”

    2)A~B => “一” + A + “​​B” 〜 “A” + B + “b” 的

    3)A~B和C~D => A + C~B + D和A + C~D + B

  3. 现在最多有1000个字符串'a'和'b'形成一个集合S,找到S的最大子集,其中每个元素必须很好并且对(A,B)都不包含A~B。输出基数。

    与我之前看到的问题有所不同: A + B + C + D~A + C + B + D~B + D + A + C但A + B + C + D~B + D + A + C不成立。

    对我来说有两个困难:

    1. 如何检查S1~S2
    2. 如果我知道每一对的“〜”,我怎样才能找到基数
    3. 更多细节:https://www.spoj.pl/problems/ABWORDS/

1 个答案:

答案 0 :(得分:1)

构造一个好词的规则意味着每个好词都以“a”开头,以“b”结尾。因此,有一个独特的(直到排序 - 规则3)将一个好词分解为好的子词:找到所有“ab”,然后尝试使用规则2扩展它们,并使用规则3对它们进行排序。可以通过树表示这种分解(n个分支用于重复应用规则3)。

在树上下文中,“〜”关系只是表示同构树,我认为(分支顺序无关紧要)。

编辑:正如所指出的,分支机构的订单很重要。

我将尝试解决原始链接中所述的问题(“好”的2个定义不一致)。

首先,两个单词X和Y之间的相似性,使用DP。

f(a, b, n)定义为表示X[a..a+2n-1]Y[b..b+2n-1]相似且两个子词都很好的函数。

f(a, b, 0) = 1.

表示n> 0,

f(a, b, n) = f1(a, b, n) or f2(a, b, n) or f3(a, b, n)
f1(a, b, n) = x[a] == y[b] == 'a' and x[a+2n-1] == y[b+2n-1] == 'b' and f(a+1, b+1, n-1)
f2(a, b, n) = any(1 <= k < n) f(a, b, k) and f(a+2k, b+2k, n-k)
f3(a, b, n) = any(1 <= k < n) f(a, b+2(n-k), k) and f(a+2k, b, n-k)

我认为这是O(n ^ 4)(urgh)。

对于第二部分,如果您将单词表示为具有表示相似关系的边的图,我认为您基本上是在尝试找到最大的独立集。如果是这样,祝你好运!它是NP难的(即没有比尝试所有更好的解决方案) 在一般情况下,我没有看到任何使这更容易的属性:(

EDITED 使相似度的定义自动检查好看。这很容易。

由于我的愚蠢,再次

EDITED