P1439 【模板】最长公共子序列 LCS
P1439 【模板】最长公共子序列
题解
1.RE的暴力DP O(n2)
我们设dp[i][j]表示,S串的第i个前缀和T串的第j个前缀的最长公共子序列。
◦ 分情况:
◦ 如果S[i]==T[j],dp[i][j]=dp[i-1][j-1]+1;
◦ 如果S[i]!=T[j],dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
◦ 最后答案就是dp[n][m]
◦ 对于dp[i][j]:
◦ 如果,两个串最后一个位置相同,这两个位置一定在公共子序列中。
◦ 那么我们只需要求出S的i-1前缀和T的j-1前缀的最长上升子序列就可以了,而这个就是把问题化小。
◦ 如果最后一个位置不相同,那么两个位置一定不能匹配,所以肯定是另外两种情况选最大的。

2.正解 O(nlogn)
这道题目是求两个全排列的LCS
那么对于排列 b 中的每一个数字都会在排列 a 中出现,只是出现的顺序不同
那么我们设置一个 pos [ ] 数组,记录下 a 序列中每个数字出现的位置

然后输入 b 序列,那么找出 b 中的每个数字对应 a 中数字出现的位置
为什么是求b对应的pos数组的LIS呢???
给定a数组,我们求LCS,一定是拿着b数组从前往后一一比对的,b中数字的在a中出现的顺序如果是递增的,那么就有机会顺着前面的位置接下去,扩展LCS
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=1e5+;
int n,a[maxn],pos[maxn],y;
int d[maxn],len=; int main()
{
n=read();
for(int i=;i<=n;i++)
a[i]=read(),pos[a[i]]=i;
for(int i=;i<=n;i++)
{
y=read();
int now=pos[y];
if(now>d[len]) d[++len]=now;
else d[lower_bound(d+,d+len+,now)-d]=now;
}
printf("%d",len);
return ;
}
P1439 【模板】最长公共子序列 LCS的更多相关文章
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 51Nod 1006:最长公共子序列Lcs(打印LCS)
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 每日一题-——最长公共子序列(LCS)与最长公共子串
最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...
- 51nod 1006:最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
随机推荐
- PHP点击按钮拷贝
一.PHP中点击按钮拷贝文本,我一个页面有多个按钮,相同颜色的标注代表了相同的列或ID 二.这是HTML代码 <tr> <td>直播流地址(延时60秒)</td> ...
- 第一章、接口规范之Restful规范
阅读目录 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源 2.5 资源操作由请求方式决定 3.1 正常响应 3.2 重定向响应 3.3 客户端异常 3.4 ...
- Oracle笔记(十) 约束
表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性,按照约束的分类,一共有五种约束:非空约束.唯 ...
- Python之datetime模块
datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo. 1.date类 datetime.date(year, ...
- 在Visual Studio Code 运行 webpack ./src/main.js --output-filename ./dist/bundle.js --output-path . --mode development 提示 Module no t found:Error:Can't resolve' 'jquery' 是因为vs code还没安装jquery
在Visual Studio Code 运行 webpack ./src/main.js --output-filename ./dist/bundle.js --output-path . --mo ...
- k8s-应用部署
该demo主要作为一个dubbo项目通过maven自动化docker打包插件发布到镜像仓库样例工程.该wiki后面同时会提供k8s部署zk,mysql,应用包的整个过程.该项目大体功能:zk作为注册中 ...
- java Timer和TimerTask(简单的使用)
Timer 是一个定时工具 TimerTask 是一个实现了Runnable接口抽象类,代表可以被Timer执行的任务 (1)Timer.schedule(TimerTask task,Date ti ...
- JavaScript三元运算符
㈠条件运算符也叫做三元运算符 ⑴语法:条件表达式?语句1:语句2: ⑵执行的流程: ①条件运算符在执行时,首先对条件表达式进行求值 ▶如果该值为true,则执行语句1,并返回执行结果 ▶如果该值为fa ...
- Luogu P2146 [NOI2015]软件包管理器 树剖
卸载:把子树清空: 安装:把自己到$1$的链改为$1$ #include<cstdio> #include<iostream> #include<cstring> ...
- Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...