对于一串互不相同的元素,求它们其中两个不同排列的最长公共子序列
记录第一串序列的每个元素的位置序号,将第二串序列赋上该元素的位置序号
然后该问题就转换成了求最长上升子序列
*********************************************************************************************************
#include <cstdio> using namespace std; const int maxn = 1e5 + 10; const int INF = 1e6; int a[maxn], hash_[maxn], dp[maxn]; int bin_find(int key, int l, int r); int main() { int i; int n, x; scanf("%d", &n); for(i = 1; i <= n; ++i) { scanf("%d", &x); hash_[x] = i; } for(i = 1; i <= n; ++i) { scanf("%d", &x); a[i] = hash_[x]; } int len = 0; dp[0] = -INF; for(i = 1; i <= n; ++i) { if(a[i] > dp[len]) dp[++len] = a[i]; else { int pos = bin_find(a[i], 1, len); dp[pos] = a[i]; } } printf("%d\n", len); return 0; } int bin_find(int key, int l, int r) { while(l <= r) { int mid = (l+r)>>1; if(key <= dp[mid]) r = mid - 1; else l = mid + 1; } return r + 1; }