UVA 10635 Prince and Princess
阿新 • • 發佈:2018-12-30
一開始用滾動陣列寫了個N^2 的LCS 果斷TLE了。
由於每個序列的元素都是互不相同的,所以將A序列重新編號,0-p,然後根據這個編號,對B也重新編號,那麼實際上A和B的LCS問題就轉化為求B的LIS,複雜度是O(NlogN)
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <iostream> #include <map> #include <vector> #include <algorithm> using namespace std; #define clr(a, x) memset(a, x, sizeof(a)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define REP(i,a,b) for(int i=a;i<=b;i++) typedef long long lld; const int maxn = 255*255; int dp[maxn],cnt; int N,P,Q; int p[maxn],q[maxn],pos[maxn]; vector<int> v; int main() { int T,cas=1; scanf("%d",&T); while(T--) { scanf("%d %d %d",&N,&P,&Q); clr(pos,-1); v.clear(); cnt=0; for(int i=0;i<=P;i++) scanf("%d",&p[i]),pos[p[i]]=i; for(int i=0;i<=Q;i++) { int x; scanf("%d",&x); if(pos[x]==-1) continue; q[cnt++]=pos[x]; } for(int i=0;i<cnt;i++) { int t=lower_bound(v.begin(),v.end(),q[i])-v.begin(); if(t==v.size()) { v.push_back(q[i]); dp[i]=v.size(); } else { v[t]=q[i]; dp[i]=t+1; } } printf("Case %d: %d\n",cas++,dp[cnt-1]); } }