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

  先看题目第一个想到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. Spring 事件

    JDK事件 java通过java.util.EventObject类和java.util.EventListener接口描述事件和监听器 事件源,事件的产生者,任何一个EventObject都必须拥有 ...

  2. list中放map的几种方式

    package Test; import java.util.*; public class Test { public static void main(String[] args) { //第一种 ...

  3. (网页)HTML小技巧的一些小技巧

    转自CSDN: 1.怎样定义网页语言(字符集)?            在制作网页过程中,你首先要定义网页语言,以便访问者浏览器自动设置语言,而我们用所见即所得的HTML工具时,都没有注意到这个问题, ...

  4. LazyMan深入解析和实现

    一.题目介绍  以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank!   ...

  5. Asp.Net配置不允许通过url方式访问目录下的资源

    Asp.Net网站发布后,有部分文件为了安全性,是不能直接通过url访问获取 通常有2种做法: 1.将文件目录建立在 App_code 或者App_Data 等默认的隐藏目录下 2.将文件的目录添加到 ...

  6. GPU与CPU的区别

    作者:虫子君 链接:https://www.zhihu.com/question/19903344/answer/96081382 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. 第六章 Hyper-V 2012 R2 的检查点

    "检查点"是 Windows Server 2012 R2 中对 Windows Server 2012 及以前版本的 Hyper-V"快照"功能的新称呼.之所 ...

  8. 【PAT】B1068 万绿丛中一点红(20 分)

    一开始因为看见这题就头疼,可费了点时间. 要考虑所有元素,如果忽略外圈元素,最后一个样例过不去. 而且要求只出现一次的元素, 我没有使用map,因为当时还没学,用map储存元素会节约好多代码 #inc ...

  9. C#中类为什么要实例化

    在使用C#语言时,发现一下有关类实例化的问题,在此之前先复习一下类和对象的概念,类是一个抽象体,是对一类事物的抽象体:而对象就是一个具体的事物,对象的抽象就是类.车就是一个类,而车包括面包车,小汽车, ...

  10. 【Excel】SUMIF函数的兼容性

    兼容性非常强的两个函数 SUMIF() 说兼容性,当然得说SUMIF了. 来,我们先举个例子. 现有一个表格,算起来只有"科目划分"."发生额"两列内容,但是折 ...