Description
给出 n n n和长度为 n n n的两个序列 A , B A,B A,B,求他们的最长公共子序列
朴素算法
设 f i , j {f_{i,j}} fi,j为 A A A序列枚举到 i i i, B B B序列枚举到 j j j,最长公共子序列的长度
显然:
f
i
,
j
=
m
a
x
{
f
i
−
1
,
j
−
1
+
(
A
i
=
=
B
j
)
,
f
i
−
1
,
j
,
f
i
,
j
−
1
}
f_{i,j}=max\{f_{i-1,j-1}+(A_i==B_j),f_{i-1,j},f_{i,j-1}\}
fi,j=max{fi−1,j−1+(Ai==Bj),fi−1,j,fi,j−1}
转移即可
a n s = m a x { f i , j } ans=max\{f_{i,j}\} ans=max{fi,j}
时间复杂度 O ( n 2 ) O(n^2) O(n2)
进阶
若 A , B A,B A,B为 n n n的排列
则每个 A i A_i Ai都有与之对应的 B i B_i Bi,题目转化为
设 p o s A i = i pos_{A_i}=i posAi=i,则对于 f i = p o s B i f_i=pos_{B_i} fi=posBi,求最长上升子序列
用单调栈优化 D P DP DP解决即可