(为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是写一下笔记。今后不排除你们还会看到最小生成树、背包等基础算法的笔记……)
最长公共子序列(Longest Common Subsequence,LCS)是动态规划中的经典问题,顾名思义,即求两个序列最长的公共子序列(可以不连续)。在本文中,我们规定用
abdcbab
和
bdcbabb
两个字符串,记为
既然已经说了是动态规划问题,我们就考虑如何从子状态转移过来。这有两种情形,第一种,如果两个序列最后一个元素相同,比如abecbab
和bdcbabb
,最后一个元素相同,所以它们的LCS长度就是abecba
与 bdcbab
的LCS长度加上1。这是因为,
![ca22e61efa0862d4ba60de6d6335cbb0.png](https://i-blog.csdnimg.cn/blog_migrate/fc13db8d53dd5b237ffce933d5b4f1a1.jpeg)
如果最后一个元素不同,则LCS长度应为
![8bd11bf1cbe81c473a8eca8a80c6651e.png](https://i-blog.csdnimg.cn/blog_migrate/5a583716675082f01449b016f5fa8923.jpeg)
当然,我们还需要处理一下边界条件,即当