洛谷P1439 【模板】最長公共子序列
阿新 • • 發佈:2018-11-09
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 【模板】最長公共子序列