偶然看到的一道题,感觉做法很有意思。
题目大意
求两个数列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的公共数字
而选择单调递增的数字则能保证子序列的性质。
之后就很简单了。