!-- Loading 底层遮罩 -->

P1439 最长公共子序列

传送门

思路

经典的LCS问题,但是朴素解法无法通过大数据,考虑到两个序列都是 n 的全排列,数值都相等但是位置不同。可以对P1序列作一个映射,转化成编号1到 n,那么此时P1序列是一个严格递增序列,因此LCS也一定是一个严格递增序列, 以P1的映射关系转化P2后P2中最长严格递增序列的长度(LIS)即为LCS长度。至此完成LCS问题到LIS问题的转化。 

代码

#include<iostream>
#include<algorithm>
#include<map>
#define MAXN 100007
using namespace std;
int n, a[MAXN], b[MAXN], g[MAXN], len;
map<int, int> change;
int main(void)
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        change[a[i]] = i;
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> b[i];
        b[i] = change[b[i]];
    }
    for (int i = 1; i <= n; i++)
    {
        if (b[i] > g[len]) g[++len] = b[i];
        else {
            int pos = upper_bound(g + 1, g + len + 1, b[i]) - g;
            g[pos] = b[i];
        }
    }
    cout << len;
    return 0;
}
 

 

posted @ 2022-03-30 20:15  Thinker-X  阅读(20)  评论(0)    收藏  举报