又是模板题呵,但这次的难度有点增加。

  先看题目第一个想到DP的经典算法,要O(n^2),然后想其它的算法。

  其实我们衢州市一次联考有一题很像这题,不过还要难一点。

  思想是离散化+最长不下降子序列(在这里和最长上升子序列等价,因为没有重复的值)

  先离散一下第二串里每个点的第一串里的位置(数组也可以,但我喜欢用map),如样例:

  5

  3 2 1 4 5
  1 2 3 4 5

  散出来就是 3 2 1 4 5,然后为了使他们公共最长,想到什么?

  最长不下降子序列!为什么?

  刚开始做的是根据他们的数值,但现在将他们转化成了标号(important)

  对于第一串的标号,很简单,就是1~n(自己对应自己的位置)

  然后剩下的就是在第二串里找最长的递增作为它的重复部分了。

  如果裸的最长不下降子序列(DP),复杂度也是O(n^2),贴一下代码,但道理应该大多数OI的书上都有

  50CODE

#include<cstdio>
#include<map>
using namespace std;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline int max(int a,int b) { return a>b?a:b; }
const int N=;
map <int,int> ma;
int n,x,num[N],f[N],ans,i,j;
int main()
{
read(n);
for (i=;i<=n;++i)
read(x),ma[x]=i;
for (i=;i<=n;++i)
read(x),num[i]=ma[x];
for (i=;i<=n;++i)
{
f[i]=;
for (j=;j<i;++j)
if (num[j]<num[i]) f[i]=max(f[i],f[j]+),ans=max(ans,f[i]);
}
printf("%d",ans);
return ;
}

  然后优化。方法有两种——二分或树状数组。

  个人还是感觉二分的简单些(因为不会打树状数组的版本)

  用top表示最长不下降子序列的长度;表示用f[i]表示i长度的结尾元素的值。

  仔细观察一下,发现他们满足f[1]<=f[2]<=f[3]……

  然后就可以进行二分优化了

  CODE(常数还挺小)

#include<cstdio>
#include<map>
using namespace std;
const int N=;
map <int,int> ma;
int n,x,num[N],f[N],i,top;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline int max(int a,int b) { return a>b?a:b; }
inline int find(int x)
{
int left=,right=top,res=;
while (left<=right)
{
int mid=left+right>>;
if (f[mid]<x) res=mid,left=mid+; else right=mid-;
}
return res;
}
int main()
{
read(n);
for (i=;i<=n;++i)
read(x),ma[x]=i;
for (i=;i<=n;++i)
read(x),num[i]=ma[x];
for (i=;i<=n;++i)
{
if (!top) { f[++top]=num[i]; continue; } else
{
if (num[i]<f[]) f[]=num[i];
int k=find(num[i]);
top=max(top,k+);
f[k+]=num[i];
}
}
printf("%d",top);
return ;
}

Luogu P1439 【模板】最长公共子序列的更多相关文章

  1. 【Luogu P1439】最长公共子序列(LCS)

    Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...

  2. luogu P2516 [HAOI2010]最长公共子序列

    传送门 首先那个\(O(n^2)\)的dp都会吧,不会自己找博客或者问别人,或是去做模板题(误) 对以下内容不理解的,强势推荐flash的博客 我们除了原来记录最长上升子序列的\(f_{i,j}\), ...

  3. 【Luogu】P3402最长公共子序列(LCS->nlognLIS)

    题目链接 SovietPower 的题解讲的很清楚.Map或Hash映射后用nlogn求出LIS.这里只给出代码. #include<cstdio> #include<cctype& ...

  4. Luogu P2516 [HAOI2010]最长公共子序列 DP

    首先$LIS$显然:$f[i][j]=max(f[i][j-1],f[i-1][j],(a[i]==b[j])*f[i-1][j-1])$ 考虑如何转移数量: 首先,不管$a[i]$是否等于$b[j] ...

  5. 洛谷 P1439 【模板】最长公共子序列

    \[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为 ...

  6. P1439 【模板】最长公共子序列 LCS

    P1439 [模板]最长公共子序列 题解 1.RE的暴力DP O(n2) 我们设dp[i][j]表示,S串的第i个前缀和T串的第j个前缀的最长公共子序列. ◦          分情况: ◦      ...

  7. P1439 【模板】最长公共子序列(DP)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  8. 洛谷P1439 【模板】最长公共子序列

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  9. P1439 【模板】最长公共子序列

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  10. 洛谷 P1439 【模板】最长公共子序列 题解

    每日一题 day40 打卡 Analysis 因为两个序列都是1~n 的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个book数组将A序列的数字在B序列中的位置表示出来 ...

随机推荐

  1. linux Mate Lxde 消耗资源对比

    腾讯云 标准型SA1 | SA1.SMALL1 1核1G AMD LXDE: MATE:

  2. JavaScript大杂烩1 - 理解JavaScript的类型系统

    随着硬件水平的逐渐提高,浏览器的处理能力越来越强大,本人坚信,客户端会越来越瘦,瘦到只用浏览器就够了,服务端会越来越丰满:虽然很多大型的程序,比如3D软件,客户端仍然会存在,但是未来的主流必将是浏览器 ...

  3. Java 数据驱动测试

    适用场景 测试搜索功能, 基于数据类型需要测多种不同的数据, 比如最大值, 小数, 负数, 字符串, 特异符号等等. 如果直接写代码, 每一种数据类型都需要写一遍代码, 冗长且不方便调试. 如果采用数 ...

  4. VS2015 无法启动 IIS Express Web 服务器 解决方案

    VS2015 IIS Express 无法启动Web 解决方案 [亲测已成功] 1.我的电脑—管理—事件查看器—Windows日志—应用程序: 详细信息会提示你:[模块 DLL C:\Program ...

  5. Java学习笔记--JDK动态代理

    1.JDK动态代理     JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和 ...

  6. 【记录】GIT 常用命令记录

    1. 查看所有的提交版本,包含当你co到之前提交版本后依旧可以看到以前的日志 git log --graph --pretty=format:'%h -%d %s (%cr)' --abbrev-co ...

  7. Java客户端连接kafka集群报错

    往kafka集群发送消息时,报错如下: page_visits-1: 30005 ms has passed since batch creation plus linger time 加入log4j ...

  8. File类_常见的方法(获取,创建与删除,判断,重命名)

    获取:  1.1获取文本名称  1.2获取文件路劲  1.3获取文件大小  1.4获取文件修改或创建时间 import java.io.File; import java.text.DateForma ...

  9. C/C++每日小练(七)——墓地雕塑

    墓地雕塑 题目描写叙述: 在一个周长为10000的圆上等距分布着n个雕塑. 如今又有m个新雕塑增加(位置能够任意放).希望全部n+m个雕塑在圆周上均匀分布.这就须要移动当中一些原有的雕塑.要求n个雕塑 ...

  10. go标准库的学习-encoding/xml

    参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/xml" 实现的简单的理解XML命名空间的XML 1.0编译器 f ...