1. 程式人生 > >洛谷P1439 【模板】最長公共子序列

洛谷P1439 【模板】最長公共子序列

1-n ont range else 輸入輸出格式 pac algo mes 格式

題目描述

給出1-n的兩個排列P1和P2,求它們的最長公共子序列。

輸入輸出格式

輸入格式:

第一行是一個數n,

接下來兩行,每行為n個數,為自然數1-n的一個排列。

輸出格式:

一個數,即最長公共子序列的長度

輸入輸出樣例

輸入樣例#1: 復制
5 
3 2 1 4 5
1 2 3 4 5
輸出樣例#1: 復制
3

說明

【數據規模】

對於50%的數據,n≤1000

對於100%的數據,n≤100000

****復雜度為nlogn哦,離散化,然後求最長上升序列

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4
#include<algorithm> 5 using namespace std; 6 int i,j,n,a[100005],b[100005],ans,c[100005],f[100005]; 7 int main() 8 { 9 scanf("%d",&n); 10 for(i = 1;i <= n;i++) 11 { 12 scanf("%d",&a[i]); 13 c[a[i]] = i; //用於離散化 14 } 15 for(i = 1;i <= n;i++) 16 { 17 scanf("
%d",&b[i]); 18 f[i] = 0x7ffffff; 19 } 20 f[0] = 0; 21 ans = 0; 22 for(i = 1;i <= n;i++) 23 { 24 int l = 0,r = ans,mid; 25 if(c[b[i]] > f[ans]) //求最大上升子序列 26 { 27 ans++; 28 f[ans] = c[b[i]]; 29 } 30 else 31 {
32 while(l < r) 33 { 34 mid = (l + r) / 2; 35 if(f[mid] > c[b[i]]) 36 r = mid; 37 else 38 l = mid + 1; 39 } 40 f[l] = min(f[l],c[b[i]]); // 求最大上升子序列長度為l時的最後一個值越小越好 41 } 42 } 43 printf("%d",ans); 44 return 0; 45 }

洛谷P1439 【模板】最長公共子序列