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

  先看题目第一个想到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. loadrunner 场景设计-添加Windows Resources计数器

    场景设计-添加Windows Resources计数器 by:授客 QQ:1033553122 目的 监控要测试的windows服务器的资源使用情况 步骤 1.添加视图,方法双击.拖动左侧的Windo ...

  2. Android 高德地图定位

    创建Key 打开高德开发平台 → 我的应用 → 创建应用 → 创建新Key 说明: 1.发布版安全码获取:用自己的签名打包成apk安装软件,用SHA1工具查看 2.调试版安全码获取: 直接运行安装软件 ...

  3. 兼容多种模块规范(AMD,CMD,Node)的代码

    在JavaScript模块化开发中,为了让同一个模块可以运行在前后端,以及兼容多种模块规范(AMD,CMD,Node),类库开发者需要将类库代码包装在一个闭包内. AMD规范 AMD,即“异步模块定义 ...

  4. 洗礼灵魂,修炼python(45)--巩固篇—【转载】类的__now__和__init__

    学到这里了,相信你应该对__init__非常熟悉了,就是构造器呗,当类被实例化时初始化的作用 但__init__其实不是实例化一个类的时候第一个自动调用的方法.当实例化一个类时,最先被调用的方法 其实 ...

  5. https证书概念

    https://studygolang.com/articles/10776 http://www.360doc.com/content/15/0520/10/21412_471902987.shtm ...

  6. 【转】struct和typedef struct在C/C++中的区别

    分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可 ...

  7. 记录线上一次线程hang住问题

    线上发现执行某特定任务在某个特定时间点后不再work.该任务由线程池中线程执行定时周期性调度,根据日志查看无任何异常.从代码研判应该无关定时任务框架,因为对提交的定时任务做了wrap,会将异常都cat ...

  8. css给列表添加序号

    .middle ul{ counter-reset: show-list; } li{ padding-left: 30px; line-height: 1.3; position: relative ...

  9. 布局:高度已知,布局一个三栏布局,左栏和右栏宽度为200px,中间自适应

    需求:高度已知为200px,写出三栏布局,左栏和右栏各位200px,中间自适应,如下图所示: 方法一:float浮动布局 原理是:定义三个区块,需要注意的是中间的区块放在右边区块的下面,统一设置高度为 ...

  10. JVM的新生代、老年代、MinorGC、MajorGC

    参考资料: http://blog.csdn.net/flamezyg/article/details/44673951 http://www.blogjava.net/ldwblog/archive ...