uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))
标题效果:有两个长度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说明)
版权声明:本文博客原创文章。博客,未经同意,不得转载。
uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))的更多相关文章
- UVA - 10635 Prince and Princess LCS转LIS
题目链接: http://bak.vjudge.net/problem/UVA-10635 Prince and Princess Time Limit: 3000MS 题意 给你两个数组,求他们的最 ...
- uva 10635 - Prince and Princess(LCS)
题目连接:10635 - Prince and Princess 题目大意:给出n, m, k,求两个长度分别为m + 1 和 k + 1且由1~n * n组成的序列的最长公共子序列长的. 解题思路: ...
- UVA 10635 - Prince and Princess LCS转化为LIS
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Uva 10635 - Prince and Princess LCS/LIS
两个长度分别为p+1和q+1的由1到n2之前的整数组成的序列,每个序列的元素各不相等,两个序列第一个元素均为1.求两个序列的最长公共子序列 https://uva.onlinejudge.org/in ...
- UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19051 题意: 有两个长度分别为p+1和q+1的由1到n2 ...
- Uva 10635 - Prince and Princess 问题转化,元素互不相同(在自身序列中独特)的两个数列的LCS,LIS 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- Uva 10635 Prince and Princess (LCS变形LIS)
直接LCS是时间复杂度是O(p*q)的,但是序列元素各不相同,只要把其中一个序列映射成有序的, 另外一个序列再做相同的映射,没有的直接删掉,就变成了求另一个序列LIS. #include<bit ...
- UVA - 10635 Prince and Princess(LCS,可转化为LIS)
题意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n2的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 分析: A = {1,7,5,4,8,3, ...
- UVA 10635 Prince and Princess—— 求LCS(最长公共子序列)转换成 求LIS(最长递增子序列)
题目大意:有n*n个方格,王子有一条走法,依次经过m个格子,公主有一种走法,依次经过n个格子(不会重复走),问他们删去一些步数后,重叠步数的最大值. 显然是一个LCS,我一看到就高高兴兴的打了个板子上 ...
随机推荐
- windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息)
原文:windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息) 前几天做项目用到, 代码贴给大家. /// <summary> /// 获取当前位置的经纬度 ...
- Spark1.0.0 属性配置
1:Spark1.0.0属性配置方式 Spark属性提供了大部分应用程序的控制项,而且能够单独为每一个应用程序进行配置. 在Spark1.0.0提供了3种方式的属性配置: Sp ...
- 从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)
原文:从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库) 1.安装对应dll Update-Package Xama ...
- UIPinchGestureRecognizer 的scale使用
使用 UIPinchGestureRecognizer 手势可以放大或缩小UIImageView视图.放大或缩小的值是根据 UIPinchGestureRecognizer 的scale决定.这个值在 ...
- shell编程三大神器之awk
- easyui出口excel无法下载框弹出的办法来解决
使用前ajax发,码如下面(ActionUrl一般处理程序ashx路径): $.ajax({ url: ActionUrl + '?action=export&ID=' + $('#fm_ID ...
- chain pattern
16.4 纯与不纯的职责链模式 职责链模式可分为纯的职责链模式和不纯的职责链模式两种: (1) 纯的职责链模式 一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担 ...
- 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua
查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lu ...
- 全文检索引擎Solr 指南
全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T
- Android Volley 之自定义Request
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837 今天群里一哥们需要自定义Volley的Request的例子,于是产生 ...