这是一个spoj problem,它要求您计算不同的非空字符串,它们是所有四个字符串的子序列。例如
Input:
aabb
abab
baba
acba
Output:
4
The four sequences are "a", "b", "aa", and "ab".
我该如何解决这个问题?
答案 0 :(得分:0)
为了不破坏乐趣,我不会发表完整的答案,只是给你一些想法。
将四个字符串写为A
,B
,C
,D
。
对于非负整数i
,请为通过删除第一个A<i>
字母获得的A
子字符串写i
。相同的表示法适用于B<i>
,C<i>
,D<i>
。
对于一封信X
(从a
到z
)和四个非负整数i
,j
,k
,{ {1}},将l
定义为以F(X, i, j, k, l)
,A<i>
,B<j>
,C<k>
开头的D<l>
,X
的不同公共子序列的数量F
1}}。
尝试找到这些F(X, i, j, k, l)
之间的重复关系。这提供了一种动态编程方法。
编辑:此处有更多详情。
i0
的计算方法如下:让i
成为A[i0] = X
之后的第一个索引j0
。让k0
,l0
,i0
同样定义。
仅当j0
出现在所有四个子字符串中时,才会定义indice k0
,l0
,X
,F(X, i, j, k, l) = 0
。否则,显然A<i>
。
一旦定义了四个indice,从B<j>
开始的C<k>
,D<l>
,X
,X s
的任何公共子序列都将具有以下形式s
,其中A<i0>
是B<j0>
,C<k0>
,D<l0>
,F(X, i, j, k, l) = sum of all F(Y, i0, j0, k0, l0)
的常见子序列。因此公式:
Y
,
其中总和在a
到z
的所有-x
上运行。
最后一招:使用延迟传播来避免无用的计算。