最短不公共子串
题解
不明白那个出题人无聊到把四个问题放到一个问题中。
不过出题人既然这样做了,我们就分四个问题来讨论吧。
反正四个都是dp。
Problem 1st
应该是一个很容易想到的dp。
容易发现,最短不公共子序列的长度就是最短的无法继续向后延伸的公共子序列的长度。
后者可以通过简单dp求出。
令 d p i , j dp_{i,j} dpi,j表示 a a a串以第 i i i个字符结尾, b b b串以第 j j j个字符结尾的最长公共子序列长度。
易得状态转移方程式:
d p i , j = d p i − 1 , j − 1 + 1 ( a i = b j ) dp_{i,j}=dp_{i-1,j-1}+1\, \, \, \, (a_{i}=b_{j}) dpi,j=dpi−1,j−1+1(ai=bj)
跑一遍就完了,时间复杂度 ( n 2 ) \left(n^2\right) (n2)。
Problem 2nd
其实与上一小问的做法差不多,只需要将状态方程改改即可。
状态转移方程式变为:
d p i , j = d p i − 1 , j − 1 + 1 ( a i = b j ) dp_{i,j}=dp_{i-1,j-1}+1\, \, \, \, (a_{i} = b_{j}) dpi,j=dpi−1,j−1+1(ai=bj)
d p i , j = d p i , j − 1 ( a i