2022.8.8 闲话

一道题的 Markdown 源码的 SHA256:1c08db54e2631466d962960e94a784a578cd63a6fa0bedb23759177e7c474f62 .

LCS 的一些做法:

Longest Common Subsequence

给两个序列 \(\{a_n\}\)\(\{b_n\}\),求一个序列 \(\{c_k\}\),使得:

  • \(\{c\}\) 同时是 \(\{a\}\)\(\{b\}\) 的子序列 .
  • \(k\) 最小 .

最需输出最小的 \(k\) .

特别的,我们有一些特殊性质:

  • 性质 A:\(\{a\}\)\(\{b\}\) 为排列 .
  • 性质 B:\(\{a\}\)\(\{b\}\) 中每个数出现的次数是小常数 .

性质 A:对 \(\{b\}\) 施置换 \(\{a\}\),则问题变为求 \(\{b\}\) 的 LIS,可以 \(O(n\log n)\) 解决 .

性质 B:对于每个元素 \(x\),我们在 \(\{a\}\) 中找到 \(x\) 的出现位置并降序写出,然后替换 \(\{b\}\) 中所有 \(x\),得到序列 \(\{c\}\),求其 LIS 即为答案 .

General:令 \(dp_{i,j}\) 表示 \(a_{1\dots i}\)\(b_{i\dots j}\) 的 LCS 长度,于是可以朴素 \(O(1)\) 转移,时间复杂度 \(O(n^2)\) .

值得一提的是,在 James W. Hunt 和 Thomas G. Szymansky 的论文 "A Fast Algorithm for Computing Longest Common Subsequence" 中,给出了一个 \(\Omega(n\log n)\)\(O(n^2\log n)\) 的做法 .

posted @ 2022-08-08 19:57  Jijidawang  阅读(76)  评论(3编辑  收藏  举报
😅​