最长公共子序列问题

最长公共子序列问题

4ba118f3-b548-4e9a-ae8b-de819a301535

\(
F(i,j)=
\begin{cases}
1 & ij=0,~X_i = Y_j \\
0 & ij=0,~X_i \neq Y_j \\
F(i-1,j-1)+1 & ij>0,~X_i = Y_j \\
max[~F(i-1,j),F(i,j-1)~] & ij>0, ~ X_i \neq Y_j \\
\end{cases}
\)

 

最长公共子序列(LCS)问题中LCS的定义为“对于任意两个序列\(X,Y\),若\(Z\)为其LCS,则\(Z\)中的所有元素必然同时存在于\(X,Y\)中,且其在\(X,Y\)中的下标是递增的”。首先定义状态转移函数\(F(i,j)\)表示原问题中\(X[0…i],Y[0…j]\)子序列的LCS长度,容易得出状态转移方程如上,因为\(F(i,j)\)是单调递增的。如上图所示,在递推\(F(i,j)\)状态的同时,如果维护一个“备忘录”数组,则可利用其求出其中一个LCS,并且注意到对\(F(i-1,j)=F(i,j-1)\)的情况加以处理可求出全部LCS。下文的代码仅通过回溯状态转移数组求出其中一个LCS。

 

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部