偶然看到的一道题,感觉做法很有意思。
题目大意
求两个数列a[p],b[q]的LCS,其中数的值域为1~n*n且没有任何两个数字是相同的,且两个数列的首位皆为1。
这道题的数据范围很大,对于普通的O(n^2)的算法来讲,时间复杂度是很大的。
然而这道题有着特殊的条件,那就是没有任意两个数字是相同的。
那么我们可以考虑如果将b中数字在a中出现的位置替换为b的值,那么显然b的LIS就是a和b的LCS。
只看这句话可能不太好理解(我表达太差)
举个栗子。
样例中
a[7]={1,7,5,4,8,3,9}
b[8]={1,4,3,5,6,2,8,9}
将b的值替换
b[8]={1,4,6,3,0,0,5,7}(0表示没出现过)
这时候从b中选出的所有不为0数字都能保证是a,b的公共数字
而选择单调递增的数字则能保证子序列的性质。
之后就很简单了。
特殊条件下LCS求解
本文介绍了一种在特定条件下求解最长公共子序列(LCS)问题的有效算法。该算法利用了输入序列中数字不重复的特点,通过将一序列转换为在另一序列中的位置索引来简化问题,并最终转化为最长递增子序列(LIS)问题进行求解。
671

被折叠的 条评论
为什么被折叠?



