动态规划——最长公共子序列(洛谷P1439)
题目选自洛谷P1439
动态规划的模板题,最长公共子序列
1、譬如给定2个序列:
1 2 3 4 53 2 1 4 5
试求出最长的公共子序列。
那么 最普通的 LCS 代码:
#include<iostream> using namespace std; int dp[1001][1001],a1[2001],a2[2001],n,m; int main() {//dp[i][j]表示两个串从头开始,直到第一个串的第i位 //和第二个串的第j位最多有多少个公共子元素 cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d",&a1[i]);for(int i=1;i<=m;i++)scanf("%d",&a2[i]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1]);if(a1[i]==a2[j])dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);//因为更新,所以++; }cout<<dp[n][m]; }
2、而对于洛谷P1439而言,不仅是卡上面的朴素算法,也考察到了全排列的性质:
对于这个题而言,朴素算法是n^2的,会被10^5卡死,所以我们可以考虑nlogn的做法:
因为两个序列都是1~n的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个map数组将A序列的数字在B序列中的位置表示出来——
因为最长公共子序列是按位向后比对的,所以a序列每个元素在b序列中的位置如果递增,就说明b中的这个数在a中的这个数整体位置偏后,可以考虑纳入LCS——那么就可以转变成nnlogn求用来记录新的位置的map数组中的**LIS**。
最后贴AC代码:
题目描述
给出 1,2,…,n 的两个排列 P1 和 P2 ,求它们的最长公共子序列。
输入格式
第一行是一个数 n。
接下来两行,每行为 n 个数,为自然数 1,2,…,n 的一个排列。
输出格式
一个数,即最长公共子序列的长度。
输入输出样例
输入 1
5 3 2 1 4 5 1 2 3 4 5
输出 1
3
说明/提示
- 对于 50% 的数据,n≤10^3;
- 对于 100% 的数据,n≤10^5。
解题代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int a[100001],b[100001],mp[100001],f[100001];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){scanf("%d",&a[i]);mp[a[i]]=i;}for(int i=1;i<=n;i++){scanf("%d",&b[i]);f[i]=0x7fffffff;}int len=0;f[0]=0;for(int i=1;i<=n;i++){int l=0,r=len,mid;if(mp[b[i]]>f[len])f[++len]=mp[b[i]];else {while(l<r){ mid=(l+r)/2;if(f[mid]>mp[b[i]])r=mid;else l=mid+1; }f[l]=min(mp[b[i]],f[l]);}}cout<<len;return 0;
}
动态规划——最长公共子序列(洛谷P1439)相关推荐
- 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence
动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...
- 详解动态规划最长公共子序列--JavaScript实现
前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...
- 动态规划1--最长公共子序列
动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...
- 最长公共子序列php,动态规划(最长公共子序列LCS)
概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...
- 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)
最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...
- 动态规划--最长公共子序列
1. 子序列 摘自维基百科 在数学中,某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置而形成的新序列. 例如: 令 为一序列 那么,以下序列 是 的子序列之一.对应定义里的自然数 ...
- 动态规划——最长公共子序列(LCS)
最长公共子序列的问题描述为: 下面介绍动态规划的做法. 令 dp[i][j] 表示字符串 A 的 i 号位与字符串 B 的 j 号位之前的 LCS 长度(下标从 1 开始),如 dp[4][5] 表示 ...
- 算法导论之动态规划(最长公共子序列和最优二叉查找树)
动态规划师通过组合子问题的解而解决整个问题,将问题划分成子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.和分治算法思想一致,不同的是分治算法适合独立的子问题,而对于非独立的子问题,即各 ...
- 动态规划—最长公共子序列
问题描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度.比如:text1 = "abcde", text2 = "ace" ...
最新文章
- qml 自定义消息框_Qt qml 自定义消息提示框
- andorid 开发笔记 -- 问题与解决
- Python_logging模块
- mysql text blob_mysql的text/blob和行溢出
- deeplab运行指南
- CentOS上安装SQL Server vNext CTP1
- fork join框架_Java中的Fork / Join框架的简要概述
- 使用Spring框架实现数据库事务处理
- uva 10594(最小费用最大流)
- 实战 | 对抗外部威胁防护和勒索病毒,大厂怎么做?
- 什么是mock测试 等自己有时间好好研究一下
- 区块链 使用xbench测试xuperchain 教程
- 一键搞定JavaEE应用,JRE+Tomcat+Mysql-JaveEE绿色运行环境JTM0.9版 (转载)
- 关于评审--从思想到落地
- Bootstrap项目之微金所
- 2014年数学建模美赛题目原文及翻译
- day17-远程管理SSH服务
- DDR4内存全景解析
- autojs识别本地验证码
- zookeeper的安装使用
热门文章
- 生成纯字母随机编号的示例(大小写混合).sql
- Excel 货币中文大写汉字转化
- python软件设计数据分析统计服_Python 和 R 数据分析/挖掘工具互查
- drupal主题开发_Drupal开发人员,关于如何使您的网站更易于访问
- (9)<textarea>标签在mac环境下的问题
- 紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题[含答案解析]...
- java数组末尾添加元素_JavaScript 数组 Array对象增加和删除 元素
- linux oa系统搭建,linux版OA系统的安装配置
- 构造函数能默认初始化其静态成员么?
- MFC之CString与const char* string 转换