uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))
来源:互联网 发布:脐带血公司 知乎 编辑:程序博客网 时间:2024/04/27 18:45
题目大意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数。两个序列的第一个元素均为1。求出A和B的最长公共子序列长度。
分析:本题是LCS问题,但是p*q<=62500,O(pq)的算法显然会LE。在这里有一个条件,每个序列中的各个元素互不相同,所以可以把A中元素重新编号为1~p+1。例如,样例中A={1,7,5,4,8,3,9},B={1,4,3,5,6,2,8,9},因此把A重新编号为{1,2,3,4,5,6,7},则B就是{1,4,6,3,0,0,5,7}(在A中没有出现过的元素一定不会是公共子序列中的元素),其中0表示A中没有出现过,可以直接删去。这时B={1,4,6,3,5,7},元素的值代表着B中和原A中元素值相同的,在A中的位置。子序列的位置一定要是单调递增的,这样求得的最长子序列才相当于原A和B的最长公共子序列。由此,成功转化成LIS问题`(*∩_∩*)′。求出B的LIS即可,时间复杂度就可以优化到O(nlogn)了。
下面贴上代码(借鉴lrj巨犇的=-=)
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn = 250*250;const int INF = 1e9;int s[maxn],g[maxn],d[maxn];int num[maxn]; //num[x]为整数x的新编号,num[x]=0表示x没有在A中出现过int main(){ int T; cin>>T; for(int kase=1;kase<=T;kase++) { int N,p,q,x; cin>>N>>p>>q; memset(num,0,sizeof(num)); for(int i=1;i<=p+1;i++) { cin>>x; num[x]=i; } int n=0; for(int i=0;i<q+1;i++) { cin>>x; if(num[x]) s[n++]=num[x]; } //求解s[0]...s[n-1]的LIS 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+n+1,s[i])-g; d[i]=k; g[k]=s[i]; ans=max(ans,d[i]); } cout<<"Case "<<kase<<": "<<ans<<endl; } return 0;}
关于lower_bound函数(二分查找函数),是STL库的,不懂的童鞋请看http://blog.csdn.net/u012198382/article/details/24887181(lower_bound用法)
0 0
- uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))
- UVA 10635 Prince and Princess [序列无重复元素时 LCS转换成LIS问题求解 O(nlogn) ]
- 【UVA 10635】【LCS转化成LIS】 Prince and Princess
- UVA - 10635 - Prince and Princess (LCS转化为LIS)
- UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
- UVa 10635 - Prince and Princess 问题转化..LCS巧妙算法..
- dp(LCS转化成LIS)uva 10635 - Prince and Princess
- uva 10635 Prince and Princess (将LCS 转化为 LIS)
- UVA 10635 - Prince and Princess LCS转化为LIS
- uva-10635 Prince and Princess LCS转化为LIS
- UVA 10635 Prince and Princess LCS转化为LIS *
- UVa 10635 Prince and Princess(LCS nlogn)
- UVA 10635 Prince and Princess lcs--》lis
- Uva - 10635 - Prince and Princess(LCS转LIS)
- UVA 10635 - Prince and Princess ( LCS 转换为LIS )
- UVa 10635 - Prince and Princess(LCS转LIS)
- uva 10635 Prince and Princess(LCS转LIS~)
- UVA 10635 Prince and Princess (LCS优化转LIS)
- C#中用接口实现鸭子案例
- 程序员写给同事的一封信
- 用 JAAS 和 JSSE 实现 Java 安全性
- HDU 1224 Free DIY Tour
- C3P0连接池配置
- uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))
- sencha touch 打包apk时报错
- hadoop伪分布式系统:could only be replicated to 0 nodes, instead of 1
- C++ set 的用法
- SPFA(模板)
- JAVA内存泄漏解析
- POJ 1151 Atlantis (线段树求矩形面积并)
- poj 3017 单调队列优化DP
- oracle子查询