UVA 10635 Prince and Princess
2014-04-06 16:26
357 查看
题意描述:有两个长度分别为p+1和q+1的序列,每个元素中的各个元素互不相同。都是1~n^2之间的整数,求A和B的最长公共子序列。(2<=n<=250,1<=p,q<=n^2)
分析:本题是LCS问题,但因为p和q可以高达250^2=62500,O(pq)的算法显然太慢。注意到A序列中所有元素互不相同,因此可以把A中的元素重新编号为1~p+1。这样新的A和B的LCS实际上就是B的LIS。可以在O(nlogn)时间内解决。
分析:本题是LCS问题,但因为p和q可以高达250^2=62500,O(pq)的算法显然太慢。注意到A序列中所有元素互不相同,因此可以把A中的元素重新编号为1~p+1。这样新的A和B的LCS实际上就是B的LIS。可以在O(nlogn)时间内解决。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=251*251; const int INF=1000000000; int s[maxn],g[maxn],d[maxn]; int num[maxn]; int main() { int T; scanf("%d",&T); for(int kase=1;kase<=T;kase++) { int N,p,q,x; scanf("%d %d %d",&N,&p,&q); memset(num,0,sizeof(num)); for(int i=1;i<=p+1;i++) {scanf("%d",&x);num[x]=i;} int n=0; for(int i=0;i<q+1;i++) {scanf("%d",&x);if(num[x]) s[n++]=num[x];} for(int i=1;i<=n;i++) g[i]=INF; int ans=0; for(int i=0;i<n;i++) { int k=lower_bound(g+1,g+1+n,s[i])-g; d[i]=k; g[k]=s[i]; ans=max(ans,d[i]); } printf("Case %d: %d\n",kase,ans); } return 0; }
相关文章推荐
- UVa 10635 - Prince and Princess
- uva_10635 - Prince and Princess(LIS)
- UVa 10635 - Prince and Princess 问题转化..LCS巧妙算法..
- UVA - 10635 Prince and Princess LCS转LIS
- UVA - 10635 Prince and Princess 转化为 LIS
- uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))
- UVA 10635 Prince and Princess 递推
- UVA 10635 Prince and Princess
- Uva 10635 - Prince and Princess(最长公共子序列 nlogn 算法)
- UVA 10635 Prince and Princess DP LIS
- Prince and Princess UVA - 10635
- Prince and Princess - UVa 10635 dp
- UVA 10635 Prince and Princess(最长公共子序列)
- Uva - 10635 - Prince and Princess(LCS转LIS)
- Prince and Princess UVA 10635 王子和公主 nlogn 求最长上升子序的长度
- UVA 10635 Prince and Princess——LIS
- UVA 10635 Prince and Princess DP LIS
- UVA 10635--Prince and Princess+nlgn求最长公共子序列
- UVA-10635-Prince and Princess
- UVA 10635 Prince and Princess