在线求助

P1439 【模板】最长公共子序列

kxbb @ 2022-09-11 18:43:32

#include<bits/stdc++.h>
using namespace std;
int const N = 100010;
int main()
{
    int en,mid;
    int n;
    int a[N];
    int b[N];
    cin>>n;
    for(int i=0;i<n;i++)    scanf("%d",&a[i]);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
        for(int j=0;j<n;j++)//离散化 
        {
            if(a[j]==b[i])
            {
                b[i]=j+1;
                break;
            }
        }   
    }
    int u[N]={};
    memset(u,0,sizeof(u));
    for(int i=0;i<n;i++)//求最长上升子序列 
    {
        if(!en||u[en]<b[i])
        {
            en++;
            u[en]=b[i];
        }
        else
        {
            mid=lower_bound(u+1,u+1+en,b[i])-u;
            u[mid]=b[i];
        }
//      cout<<mid<<" "<<f[i]<<endl;
//      for(int i=0;i<=en+3;i++)    cout<<u[i]<<" ";
//      cout<<endl;
    }       
    cout<<en<<endl;
    return 0;
}

60分,思路:离散化然后求最长上升


by Dream_weavers @ 2022-09-11 18:53:34

1.你管这叫离散化?

2.O(n^2) 想过1e5?


by Register_int @ 2022-09-11 18:56:17

@kxbb 有一个办法是把所有 a 的值记录下来,这样就有了线性转化的优秀复杂度,可以通过


by kxbb @ 2022-09-11 18:58:26

@Register_int 啊懵,没听懂


by Register_int @ 2022-09-11 19:00:07

@kxbb 你的程序的目的就是找到 b 在 a里面的位置。那么就可以开一个 1e5 的数字,记录 a 里面每一个数值的对应位置,可以线性查询。


by kxbb @ 2022-09-11 19:01:08

@Register_int 哦,就把前面的修改变成O(n)是吗


by Register_int @ 2022-09-11 19:02:06

@kxbb 正确的


by kxbb @ 2022-09-11 19:02:39

@Register_int 谢谢我去改改看


by kxbb @ 2022-09-11 19:08:48

@Register_int ac啦,为表感谢赠送一个关注


|