洛谷 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 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
随机推荐
- 【leetcode刷题笔记】Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- Java如何调用dll
-----------------------------前置条件------------------------------------- 1. 首先有testdll.dll 2. 需要testdl ...
- Azure自动化部署服务 (2)
上一篇文章介绍了如何通过添加用户名和密码的方式实现自动化部署服务中与Azure Subscription的连接. 本文将介绍如何使用证书的方式实现Azure Automation与Azure的Subs ...
- w25q128 优化读写函数
#include "w25qxx.h" #include "spi.h" #include "delay.h" #include & ...
- 转载:oracle用户创建及权限设置
权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...
- 安装zendstudio和破解方法及配置svn
下载zendstudio12文件http://www.zendstudio.net/zend-studio-all-in-one-download/ 下载破解补丁http://pan.baidu.co ...
- java验证,”支持6-20个字母、数字、下划线或减号,以字母开头“这个的正则表达式怎么写?
转自:https://yq.aliyun.com/wenzhang/show_96854 问题描述 java验证,”支持6-20个字母.数字.下划线或减号,以字母开头“这个的正则表达式怎么写? 验证” ...
- 第 2 章 Python 语言入⻔
目录 2.1低而长的学习曲线 2.2Python的优势 2.3在你的计算机中安装Python 2.4如何运行Python程序 2.5文本编辑器 2.6寻求帮助 Python语言是一种流行的编程语言,在 ...
- 使用MySQL客户端登录Ensemble数据库查询相关信息
Ensemble公共MySQL数据库 对于大量数据和更详细的分析,Ensemble的MySQL服务器ensembldb.ensembl.org,useastdb.ensembl.org或asiadb. ...
- Entity Framework Code-First(9.4):DataAnnotations - Required Attribute
Required attribute can be applied to a property of a domain class. EF Code-First will create a NOT N ...