问题随之而来。
关于“好”
1)“ab”很好
2)A很好=> “a”+ A +“b”很不错
3)A和B很好=> A + B很不错
关于“〜”
1)“ab”〜“ab”
2)A~B => “一” + A + “B” 〜 “A” + B + “b” 的
3)A~B和C~D => A + C~B + D和A + C~D + B
现在最多有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不成立。
对我来说有两个困难:
答案 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 。