洛谷 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 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
随机推荐
- web网页打印的方法
WebBrowser.ExecWB的完整说明 个人感觉的:致命缺点-----------------仅仅支持ie浏览器 document.all.WebBrowser.ExecWB WebBrowse ...
- Winform开发入门集中培训系列文章
最近有个培训,写PPT不如写博客了,共享是程序猿的职业情操吧,因此,本人准备写一个Winform开发的系列文章,对于初级开发者来说,应该比较有用,写作当中不免错误或不成熟的地方,看到的朋友请留言指出, ...
- Qt Quick中的信号与槽
在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...
- OSS阿里云文件上传 demo。
所需jar包: aliyun-openservices-1.2.3.jar jdom-1.1.jar commons-codec-1.4.jar commons-logging-1.1.1.jar g ...
- 多版本Python共存时pip给指定版本的python安装package的方法
在Linux安装了多版本Python时(例如python2.7和3.6),pip安装的包不一定是用户想要的位置,此时可以用 -t 选项来指定位置. 例如目标位置是/usr/local/lib/pyth ...
- dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架.下面就简单介绍一下RPC框架技术选型的过 ...
- Android ANR原因以及开发时如何预防
经常可以在Android系统上发现ANR异常响应的问题.故了解一下ANR出现的原因 一. Android系统中,应用程序的响应是由ActivityManager 和 WindowManger系统服务监 ...
- JasperReports项目中的应用
转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html . 2.业务处理 //返回报表查询结果 List<ReportEl ...
- centos7安装与配置ansible
此次测试总共有三台机,分别如下: ansible服务器:10.0.0.20 client01:10.0.0.21 client02:10.0.0.22 一.安装ansible 1. python版本需 ...
- 从Github远程库安装Node.JS
3)从Github远程库安装Node.JS在这个方法中我们需要一些步骤来把Node.js的从Github上的远程的仓库克隆到本地仓库目录 在开始克隆(克隆)包到本地并且配制之前,我们要先安装以下依赖包 ...