題目描述:
輸入兩個整數數組A和B,二者中元素都滿足唯一且無序,同時A中的元素在B中都存在,B中元素在A中也存在,即A和B僅僅元素順序可能不同,比如(1,3,5,2)和(3,2,1,5)。
現在想通過分別刪除A和B中的部分元素,使得A和B剩下的子序列完全相同,請輸出數組A需要刪除的最少元素數(注意數組B需要刪除相同數量的元素)。
輸入描述:
輸入共三行,第一行為一個整數n(1<=n<=100000),表示A和B中元素的個數。第二行為數組A,共n個整數,第三行為數組B,共n個整數。
輸出描述:
輸出一行為數組A需要刪除的元素數(包含換行)。
輸入:
4
1 3 5 2
3 2 1 5
輸出:
2
說明:
{1, 3, 5, 2}和{3, 2, 1, 5}的最長公共子序列有三個。分別為{1, 5}, {3, 5}, {3, 2},所以至少需要刪除2個元素。
思路分析:
首先用一個哈希表保存每個元素在A數組中的位置,接下來根據B的輸入,利用A數組來保存對應元素的B中的位置。實質上對於A,B是需要查找二者相等元素的最長上升序列。
代碼:
1 #include<stdio.h> 2 #include<iostream> 3 #include<vector> 4 #include<algorithm> 5 #include<string> 6 #include<map> 7 #include<limits.h> 8 #include<queue> 9 using namespace std; 10 11 int LIS(vector<int>&A, vector<int>&B) 12 { 13 int len=1; 14 B[0]=A[0]; 15 for(int i=1; i<A.size(); i++) 16 { 17 if(A[i]>B[len-1]) 18 B[len++]=A[i]; 19 else 20 { 21 int p = lower_bound(B.begin(), B.begin()+len, A[i])-B.begin(); 22 B[p] = A[i]; 23 } 24 } 25 return len; 26 } 27 28 int main() 29 { 30 int n; 31 cin>>n; 32 vector<int>A(n); 33 vector<int>B(n); 34 map<int, int>M; 35 for(int i=0; i<n; i++) 36 { 37 cin>>A[i]; 38 M[A[i]]=i; 39 } 40 int k=0; 41 for(int i=0; i<n; i++) 42 { 43 int x; 44 cin>>x; 45 A[M[x]] = k++; 46 } 47 int ans = n-LIS(A,B); 48 cout<<ans<<endl; 49 return 0; 50 }