Uva-10635-Prince and Princess
2013-03-21 20:51
267 查看
题目给你2个序列,要求求出其最长公共子序列。
本来打算用LCS做的,但是看了数据发现其会严重超时,后来看了书上的解法,才知道居然可以将LCS转化为LIS做,这样就使得时间复杂度大大的降低了。
解法:
由于题目中说明了p序列中的所有元素不会有重复,所以可以对其进行序号编号,即使得其转化为相应的下标值。
在处理q序列的过程中,首先检查在p序列中是否存在该值,若存在则对应记录为p序列中的下标值。其实这里也很好明白,因为只要我们知道q序列的值所对应在p序列中的位置,那么我们就可以求出转化后的q序列的值的LIS(最大上升子序列)即可。
算是第二次使用lower_bound,确实很方便。
代码:
本来打算用LCS做的,但是看了数据发现其会严重超时,后来看了书上的解法,才知道居然可以将LCS转化为LIS做,这样就使得时间复杂度大大的降低了。
解法:
由于题目中说明了p序列中的所有元素不会有重复,所以可以对其进行序号编号,即使得其转化为相应的下标值。
在处理q序列的过程中,首先检查在p序列中是否存在该值,若存在则对应记录为p序列中的下标值。其实这里也很好明白,因为只要我们知道q序列的值所对应在p序列中的位置,那么我们就可以求出转化后的q序列的值的LIS(最大上升子序列)即可。
算是第二次使用lower_bound,确实很方便。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e5,inf=1<<28; int num[maxn],b[maxn],g[maxn],d[maxn]; int main() { int cas,cass=1; scanf("%d",&cas); while(cas--) { int n,p,q; scanf("%d%d%d",&n,&p,&q); for(int i=1;i<=p+1;i++) { int ita; scanf("%d",&ita); num[ita]=i; } int count=0,ans=0; for(int i=1;i<=q+1;i++) { int ita; scanf("%d",&ita); if(num[ita]) b[count++]=num[ita]; } for(int i=1;i<=count;i++) g[i]=inf; for(int i=0;i<count;i++) { int k=lower_bound(g+1,g+count+1,b[i])-g; d[i]=k; g[k]=b[i]; ans=max(ans,d[i]); } printf("Case %d: %d\n",cass++,ans); } return 0; }
相关文章推荐
- Prince and Princess UVA - 10635
- Prince and Princess - UVa 10635 dp
- UVA 10635 Prince and Princess(最长公共子序列)
- uva_10635_Prince and Princess ( LIS )
- Prince and Princess UVA 10635 王子和公主 nlogn 求最长上升子序的长度
- UVA 10635 Prince and Princess——LIS
- UVA 10635--Prince and Princess+nlgn求最长公共子序列
- uva 10635 - Prince and Princess LCS
- UVA 10635 Prince and Princess
- UVa -- 10635 Prince and Princess 【想法】
- UVA 10635 - Prince and Princess
- uva 10635-Prince and Princess 【LIS 求解 LCS】
- Uva 10635 Prince and Princess (LCS变形LIS)
- UVA-10635-Prince and Princess
- uva 10635 - Prince and Princess
- UVA 10635 Prince and Princess(LIS)
- UVA 10635 Prince and Princess(最长公共子序列转为最长上升子序列)
- uva 10635 Prince and Princess
- UVa 10635 Prince and Princess(JAVA版)
- (UVA - 10635)Prince and Princess (LCS变形为LIS,DP)