洛谷 P1439 【模板】最长公共子序列LCS 解题报告
是一道十分经典的LCS问题
很容易想到 n 的一般算法:
主题代码如下:
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++){
dp[i][j] = max (dp[i-1][j], dp[i][j-1]);
if (a[i] == b[j]) dp[i][j] = max (dp[i][j], dp[i-1][j-1] + 1);
}
printf ("%d", dp[n][n]);
但往下看一眼数据范围 :

没错, n ≤100000 ,n²直接TLE
题目描述中提到了两组数都是 自然数1-n的一个排列
所以这题可以这么来做:
设两个数组分别为 a 和 b
对于每一个a数组中的数,一定有一个唯一对应的相等的b数组中的数
可以将a数组中的数看作 1,2,3,4,5......n
将b数组中的数也变为对应的值,假设变为数组c,可以发现,这变成了一个最长上升子序列LIS问题
当c中的数有一个上升子序列时,则这个序列在原数组中一定与a数组是公共的
模拟一遍样例:
先把第一列数看作 1, 2, 3, 4, 5。 则3对应1, 2对应2, 1对应3 .......
第二列数变为 3, 2, 1, 4, 5
最长上升子序列为 1, 4, 5 或 2, 4, 5或3, 4, 5
可以发现,这三个序列在原数组中都能找到相应的公共部分
所以答案为3
完整代码:
#include <bits/stdc++.h>
using namespace std;
#define f(i, r) for (int i = 1; i <= r; i++)
int n, x, a[100005], k[100005], len, q[100005];
int main(){
scanf ("%d", &n);
f (i, n) scanf ("%d", &x), k[x] = i;
f (i, n) scanf ("%d", &a[i]), a[i] = k[a[i]];
f (i, n){
if (a[i] > q[len]) q[++len] = a[i];
else{
int w = upper_bound (q + 1, q + len + 1, a[i]) - q;
q[w] = a[i];
}
}
printf ("%d", len);
return 0;
}
点一下左边的推荐吧!谢谢~~~
洛谷 P1439 【模板】最长公共子序列LCS 解题报告的更多相关文章
- 洛谷1439:最长公共子序列(nlogn做法)
洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路 ...
- 洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? ...
- 洛谷 P2516 [HAOI2010]最长公共子序列
题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...
- 洛谷P2516 [HAOI2010]最长公共子序列
题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...
- 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 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
随机推荐
- [转]sscanf函数具体用法
大学生程序代写 sscanf 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed v ...
- POJ1001(C++处理大数)
Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 158025 Accepted: 38470 ...
- css3 利用perspective实现翻页效果和正方体 以及翻转效果
要点: 1 实现3D效果就需要使用perspective属性 1 页面旋转使用css3的rorate 2 使用backface-visibility 实现正面元素翻转之后背面不可见,显示出反面的元素 ...
- Mybatis下面的MapperScannerConfigurer 扫描器
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置 Ma ...
- UML核心元素--包
包是一种容器,如同文件夹一样,将某些信息分类,形成逻辑单元.包可以容纳任何UML元素,例如用例.业务实体.类图等,也包括子包. 一.分包原则: (1)高内聚:被分入同一个包的元素相互联系紧密,伸至不可 ...
- 在VirtualBox中安装CentOS 7【转载】
当初接触Linux的时候,因为条件限制,只能在VirtualBox虚拟机中安装Linux系统使用,由于是小白,爬了好多坑.于是决定写一篇关于在虚拟机中安装linux系统的文章.一是为了巩固自己的知识, ...
- zabbix 系列 (1)安装
安装server http://blog.csdn.net/xiegh2014/article/details/54988548 安装 agent http://m.blog.csdn.net/wu2 ...
- Matlab零碎知识
1.不定积分的求取 int syms x;%为自变量 f=x.^2; s=int(f,x); 其中显示辅助函数simple()和pretty()
- Python学习:命令行运行,循环结构
一.安装配置和运行方法 1.安装OpenCV 3.1: 假设安装目录为"C:\Python34" 2.配置环境变量: 方法一:直接配置:打开"控制面板",搜索& ...
- macOS 安装 Docker
系统要求 Docker for Mac 要求系统最低为 macOS 10.10.3 Yosemite,或者 2010 年以后的 Mac 机型,准确说是带 Intel MMU 虚拟化的,最低 4GB 内 ...