最長公共子序列[模板]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 100003;
int a[MAXN] , b[MAXN];
int s[MAXN] , dp[MAXN];
int n;
int flag[MAXN];
int lowbit( int x ){ return x & (-x);}
void add( int x , int delta ){
    for( int i = x ; i<= n ; i += lowbit( i ) )
        dp[i] = max( dp[i] , delta );
}
int query( int x ){
    int sum = 0;
    for( int i = x ; i ; i -= lowbit( i ) )
        sum = max( sum , dp[i] );
    return sum;
}
int main(){
    scanf( "%d" , &n );
    for( int i = 1 ; i <= n ; i ++ )
        scanf( "%d" , &a[i] ) , flag[a[i]] = i ;
    for( int i = 1 ; i <= n ; i ++ ){
        scanf( "%d" , &b[i] );
        s[i] = flag[b[i]];
    }
    memset( dp , 0 , sizeof( dp )) ;
    for( int i = 1 ; i <= n ; i ++ ){
        int t = query( s[i] - 1 ) + 1;
        add( s[i] , t );
    }
    for( int i = 1 ;i <= n ; i ++ )
        dp[0] = max( dp[0] , dp[i] );
    printf( "%d" , dp[0] );
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章