题目描述
给出1-n的两个排列P1和P2,求它们的最长公共子序列。
输入输出格式
输入格式:
第一行是一个数n,
接下来两行,每行为n个数,为自然数1-n的一个排列。
输出格式:
一个数,即最长公共子序列的长度
输入输出样例
输入样例#1:
1 | 5 |
输出样例#1:
1 | 3 |
说明
【数据规模】
对于50%的数据,n≤1000
对于100%的数据,n≤100000
Solve
首先,来看一下$N^2$的算法:
$dp[i][j]$代表$a$数组的前$i$位与$b$数组的前$j$位的最长公共子序列的长度
$dp[0][0]=(a[0]==b[0])$
用这个方法来写,对于$10^5$的数据来说,时间和空间都是不够用的
题中已经说明了:两个数组均是1-n的排列,即:两个数组的元素是相同的,只是元素所在的位置不同。那么,两个数组的公共子序列中的元素在两个数组中的相对位置是一样的
如果按照下标给第一个数组的元素赋予新的值(按照升序),
例如:$a=\{3,1,2,4,5\};b=\{1,3,2,4,5\}$
old | 3 | 1 | 2 | 4 | 5 |
---|---|---|---|---|---|
new | 0 | 1 | 2 | 3 | 4 |
对$a$进行处理后的数组为$\{0,1,2,3,4\}$
用在$a$中创建的映射关系,将$b$中的元素替换:
old | 1 | 3 | 2 | 4 | 5 |
---|---|---|---|---|---|
new | 1 | 0 | 2 | 3 | 4 |
得到的新的$b$数组为:$\{1,0,2,3,4\}$
我们可以发现:新的$b$数组的最长上升子序列即为原两个数组的最长公共子序列
Code
1 | /************************************************************************* |