首先是一道比较简单的例题:传送门
题目的提示很明显,元素无重复,然后看看样例,手玩一下,就会发现选的元素在上面对应着上升的位置,而且这还是两个排列,那么就可以建立一个从排列A到排列B的映射,然后就可以转化成为LIS问题了,这个问题是有O(nlogn)的解法的。
代码:

#include<cstdio>
using namespace std;
int n;
int a[100001];
int b[100001];
int f[100001];
int q[100001];
int mp[100001];
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);mp[a[i]]=i;}for(int i=1;i<=n;i++){int x;scanf("%d",&x);b[i]=mp[x];}int ans=0;f[1]=1;for(int i=2;i<=n;i++){f[i]=lower_bound(q+1,q+ans+1,b[i])-q;if(!q[f[i]]){q[f[i]]=b[i];}else{q[f[i]]=min(q[f[i]],b[i]);}ans=max(ans,f[i]);}if(ans==99999)ans++;printf("%d",ans);return 0;
}

传送门
然而对于这个题呢?是不是无法解决呢?
当然不是。
仔细想想可以发现,只要把数据离散化一下,就还是上面那个排列LCS问题了。
关于如何离散化,我们当然可以用map,但是由于map效率太低,我们可以采用一种效率更高的数据结构:unordered_map,这是STL实现的链式hash表,但是只在C++11标准中才有,noip中貌似可以用。
要调用这个数据结构,就要include这个头文件: < tr1/unordered_map >,然后调用一个命名空间:using namespace std::tr1
接下来就是照着上面的做就好了,没什么变化。
代码:(620ms)

#include<cstdio>
#include<tr1/unordered_map>
using namespace std;
using namespace std::tr1;
inline int read(){int x=0;char ch=' ';while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;
}
int n,m,a,mx;
int q[300001];
unordered_map<int,int> mp;
int main(){n=read();m=read();for(int i=1;i<=n;i++){mp[read()]=i;}for(int i=1;i<=m;i++){a=mp[read()];if(a==0)continue;if(a>q[mx])q[++mx]=a;else *lower_bound(q+1,q+mx+1,a)=a;}printf("%d",mx);return 0;
}

转载于:https://www.cnblogs.com/stone41123/p/7581246.html

关于特殊的LCS问题的优化相关推荐

  1. java最长公共子序列_技术分享 | 最长公共子序列在比对工具的应用

    即使如何1 在实际工作中,我们常常要对输出的文本和数据进行比对:以取证大师为例,取证大师导出的取证结果数据量很容易达到上万条.这类数据特点除了数量级大外,其实数据结构很相近.即使我们以无以伦比的细致和 ...

  2. 动态规划一:动态规划算法如何设计

    目录 历史 概念 初探 性质 记忆化搜索 动态规划算法如何设计 ? 加深理解 DAG最短路径 最长上升子序列 最长公共子序列 最大子段和 上楼梯 DP题目 实现目标:论文查重.拼写纠错.寻找最近加油站 ...

  3. HDU多校2 - 6774 String Distance(序列自动机优化lcs)

    题目链接:点击查看 题目大意:给出两个字符串 A 和 B,规定两个字符串的距离 dis( s , t ) 为,可以在字符串 s 或 t 的任意位置添加或删除字符,使得两个字符串相等的最小操作次数,现在 ...

  4. LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化

    LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化 n^2 的版本 int LCS_n_2(vector<char> &a,vector<char& ...

  5. sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。

    P5546 [POI2000]公共串 所有串合在一起,每两个串放不同的字符,求一遍后缀数组,然后利用height数组求LCS即可. #include<iostream> #include& ...

  6. POJ 1159 - Palindrome 优化空间LCS

    将原串和其逆序串的最长公共子序列求出来为M..那么2*n-M就是所需要加的最少字符..因为求出的M就是指的原串中"潜伏"的最长回文.. 问题转化为求LCS..但是n最大到5000. ...

  7. bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...

  8. 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)

    目录 最长公共子序列(LCS)问题 1.朴素做法 O(n2)O(n^2)O(n2) 2.转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 3.P2758 编辑距离 最长公共子序列(LC ...

  9. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

最新文章

  1. 数据挖掘导论读书笔记10聚类分析续
  2. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介...
  3. Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)
  4. java线程内存模型_深度解析Java多线程的内存模型
  5. 本地项目antd 修改.less文件导致内存溢出
  6. 收集、分析线上日志数据实战——ELK
  7. 对JavaScript解析JSON格式数据的理解
  8. vbyone接口引脚定义_FMC接口介绍
  9. CentOS下双网卡绑定-bond0
  10. linux中hdfs格式化,HDFS操作命令
  11. 7.Excel数据分析-员工考勤表
  12. 网页版迅雷离线下载过程分析
  13. proteus——rs-232双机通讯
  14. 分布式系统中Topology(Rack) Awareness的实现思路
  15. 双11,移动电商如何更好地吸引女性购物?
  16. (转)一个初学者RHCE学习考试之路
  17. 涨价不再“嘘声”一片,“爱优腾”集体“想开了”?
  18. Scratch编程初体验3-飞行的小猫
  19. 微信小程序创建直播间流程
  20. CoolPad 8190工程模式

热门文章

  1. python中如何统计元组中元素的个数_python-无论元素顺序如何,获取列表中的元组数...
  2. android byte转string_Dig101 - Go之string那些事
  3. 在eclipse安卓sqlite怎么用_把安卓手机性能发挥到极致之-Aid Learning
  4. Git简单命令 学习资源贴
  5. JVM面试1 :谈谈你对Java的理解
  6. 部署高可用 Etcd 集群
  7. Nexus 安装 使用说明
  8. java面向对象课件_《JAVA面向对象基础》PPT课件.ppt
  9. es解决只能查询10000条数据方案
  10. (四十九)java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案