DP 模板:最长公共子序列(LCS)
LCS 模板卡:双序列 DP 的状态定义、字符相等/不等转移与边界。
#resource / algorithm
#type / snippet
#status / growing
#algo / dp
[!info] related notes 动态规划 网格 DP 与双序列 DP 最长公共子序列
DP 模板:最长公共子序列(LCS)
识别信号
- 两个字符串 / 数组
- 问最长公共子序列长度
- 比较两个前缀
状态
dp[i][j] = s 的前 i 个字符与 t 的前 j 个字符的最长公共子序列长度
转移
if (s[i - 1] === t[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
模板
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (s[i - 1] === t[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
边界
任意一个串为空时,答案是 0。