爆零,玄关,求调

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

Liuzr20 @ 2024-08-27 09:50:56

#include<bits/stdc++.h>
using namespace std;
long long n;
int a[10005],b[10005],c[10005]={0},d[10005]={0};
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<n;i++){
        cin>>b[i];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            d[j]=max(d[j-1],c[j]);
            if(a[i]==b[j]){
                d[j]=max(d[j],c[j-1]+1);
            }
        }
    }
    cout<<d[n]<<endl;
    return 0;
}

by Dress @ 2024-08-27 09:58:02

O(n^2)过不了10^5是正常情况,可以试一下O(nlogn)的算法。 @Liuzr20


by hhztl @ 2024-08-27 09:58:08

@Liuzr20 你c[j]是干啥用的


by Dress @ 2024-08-27 10:00:57

@Liuzr20

#include<bits/stdc++.h>
#define N 100005
using namespace std;
template<typename type>
inline void read(type &x)
{
    x=0;static bool flag(0);char ch=getchar();
    while(!isdigit(ch)) flag=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    flag?x=-x:0;
}
template<typename type>
inline void write(type x,bool mode=1)//0为空格,1为换行
{
    x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
    do Stack[++top]=x%10,x/=10; while(x);
    while(top) putchar(Stack[top--]|48);
    mode?putchar('\n'):putchar(' ');
}
int n,p1[N],p2[N];
int dis[N],b[N],f[N],l;
int main(){
    ios::sync_with_stdio(false);
    read(n);
    for(int i=1;i<=n;i++){
        read(p1[i]);
        dis[p1[i]]=i;
    }
    for(int i=1;i<=n;i++){
        read(p2[i]);
    }
    for(int i=1;i<=n;i++){
        if(dis[p2[i]]>b[l]){
            b[++l]=dis[p2[i]];
            f[i]=l;
            continue;   
        }   
        int k=lower_bound(b+1,b+1+l,dis[p2[i]])-b;
        b[k]=dis[p2[i]];
        f[i]=k;
    }
    cout<<l;
    return 0;
}

参考一下我的,求关QWQ


by Liuzr20 @ 2024-08-27 10:02:33

@Dress 大佬,谢谢

但是,二分的程序,在下请教


by Liuzr20 @ 2024-08-27 10:04:56

@hhztl

c[j]好像是没用


by Liuzr20 @ 2024-08-27 10:07:13

@Dress

已关


|