Longest Common Subsequence(LCS,最长公共子序列)
- DP算法
- 状态f[i][j]: 字符串A前i个字符和字符串B前j个字符的LCS
- 转移方程:
if A[i-1] != B[j-1],
f[i][j]=max{f[i−1][j],f[i][j−1],f[i−1][j−1]}
f
[
i
]
[
j
]
=
m
a
x
{
f
[
i
−
1
]
[
j
]
,
f
[
i
]
[
j
−
1
]
,
f
[
i
−
1
]
[
j
−
1
]
}
if A[i-1] == B[j-1],
f[i][j]=max{f[i−1][j],f[i][j−1],f[i−1][j−1]+1}
f
[
i
]
[
j
]
=
m
a
x
{
f
[
i
−
1
]
[
j
]
,
f
[
i
]
[
j
−
1
]
,
f
[
i
−
1
]
[
j
−
1
]
+
1
}
- Code:
int longestCommonSubsequence(string &A, string &B) {
if(A.empty() || B.empty()) return 0;
int n = A.size(), m = B.size();
vector<vector<int>> f(n+1, vector<int>(m+1, 0));
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
if(A[i-1] == B[j-1])
f[i][j] = max(max(f[i-1][j], f[i][j-1]), f[i-1][j-1]+1);
else{
f[i][j] = max(max(f[i-1][j], f[i][j-1]), f[i-1][j-1]);
}
}
}
return f[n][m];
}
Longest Palindromic Subsequence(最长回文子序列)
Longest Increasing Continuous Subsequence(最长连续上升子序列)
Longest Increasing Subsequence(最长上升子序列)