标签:
直接LCS是时间复杂度是O(p*q)的,但是序列元素各不相同,只要把其中一个序列映射成有序的,
另外一个序列再做相同的映射,没有的直接删掉,就变成了求另一个序列LIS。
#include<bits/stdc++.h> using namespace std; int read() { char c; while(c=getchar(),c<‘0‘||c>‘9‘); int re = c-‘0‘; while(c=getchar(),c>=‘0‘&&c<=‘9‘) re = re*10+c-‘0‘; return re; } const int maxn = 250*250; int mp[maxn]; int S[maxn],g[maxn]; //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif int T; scanf("%d",&T); for(int ks = 1; ks <= T; ks++){ int n, p, q; scanf("%d%d%d",&n,&p,&q); memset(mp,-1,sizeof(mp)); for(int i = 0; i <= p; i++) { mp[read()] = i; } int c = 0; for(int i = 0; i <= q; i++){ int x = mp[read()]; if(~x){ S[c++] = x; } } memset(g,0x3f,sizeof(int)*(c+1)); int ans = 0; for(int i = 0; i < c; i++){ int k = lower_bound(g+1,g+1+i,S[i])-g; g[k] = S[i]; ans = max(ans,k); } printf("Case %d: %d\n",ks,ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jerryRey/p/4846901.html