线性DP———最长公共子序列问题(LCS)

LCS问题

        求两序列具有相同元素的最长子序列,我们可以用到动态规划的方法来解决问题

                我们用 f[i][j] 来表示序列 a[1-i] 与序列 b[1-j] 能组成的LCS的长度,f[i][j]的状态转移方程如下:  

f[i,j]=\left\{\begin{matrix}0, &i=0|j=0 \\ f[i-1,j-1]+1,&i,j>0,x_i=y_j \\ max\{f[i,j-1],f[i-1,j]\},&i,j>0,x_i \neq y_j \end{matrix}\right.

 使用两层for循环就可以解决此问题,时间复杂度为O(n*m),可以处理n<7000左右的数据

例题: 最长公共子序列(LCS)  问题 11426

题目描述

给出1-n的两个排列P1和P2,求它们的最长公共子序列。

输入描述

第一行是一个数n;(n是5~1000之间的整数)
接下来两行,每行为n个数,为自然数1-n的一个排列(1-n的排列每行的数据都是1-n之间的数,但顺序可能不同,比如1-5的排列可以是:1 2 3 4 5,也可以是2 5 4 3 1)。

输出描述

一个整数,即最长公共子序列的长度。

#include<bits/stdc++.h>
using namespace std;int n;
int a[1001],b[1001];
int f[1001][1001];int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)cin>>b[i];for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)if(a[i]==b[j])f[i][j]=f[i-1][j-1]+1;elsef[i][j]=max(f[i-1][j],f[i][j-1]);}cout<<f[n][n];
}

         而此题有一变式,即 5\leqslant n\leqslant 10^5,很明显 O(n*m) 的时间复杂度已经解决不了这个问题了,有一种 O(nlogn) 的做法是通过map将 a[i] 映射为高度,然后求b序列的最长单调递增队列,将LCS转换为LIS问题,当然这种方法只适用于 a\subseteq b 时。

#include<bits/stdc++.h>
using namespace std;int n;
int a[1000001],b[1000001];
int f[1000001];
map<int,int> mp;
int len;int main() {cin>>n;for(int i=1; i<=n; i++)cin>>a[i],mp[a[i]]=i;//将a[i]映射为高度for(int i=1; i<=n; i++)cin>>b[i];for(int i=1; i<=n; i++) { //找最长单调递增序列if(mp[b[i]]>f[len])f[++len]=mp[b[i]];else {int loc=lower_bound(f,f+len,mp[b[i]])-f;if(loc)f[loc]=mp[b[i]];}}cout<<len;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28422.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 如何锁定文件

一、背景 如果应用程序有操作本地文件的功能&#xff08;如&#xff1a;读、写、复制、移动、删除等等&#xff09;&#xff0c;那么在测试或调试该应用程序时&#xff0c;肯定需要测试文件被其他应用程序锁定时&#xff0c;你的应用程序是如何处理的。 那么如何在本地模拟文件…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

二分类结局变量Logistic回归临床模型预测——分训练集和测试集(完结)

1. 介绍 2. 基线特征 3. 单因素多因素logistic回归分析及三线表 4. 构建临床列线图模型 5. 模型评价 6. 外部数据集验证 7. 另一种发文章的办法,分训练集和测试集,分析上述3-6节的内容 这里就讲一下如何分训练集和测试集,其余的步骤和之前是一样的,分训练集和测试集用…

126、仿真-基于51单片机16×16点阵滚动显示仿真设计(Proteus仿真+程序+配套资料等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

上市公司前端开发规范参考

上市公司前端开发规范参考 命名规则通用约定文件与目录命名HTML命名CSS命名JS命名 代码格式通用约定HTML格式CSS格式JS格式注释 组件组件大小单文件组件容器组件组件使用说明Prop指令缩写组件通讯组件的挂载和销毁按需加载第三方组件库的规定 脚手架使用规范移动端脚手架PC端脚…

Apache HTTPD 多后缀解析漏洞

Apache HTTPD 多后缀解析漏洞 一、环境搭建二、漏洞原理三、漏洞复现 一、环境搭建 如下介绍kali搭建的教程 cd ~/vulhub/httpd/apache_parsing_vulnerability // 进入指定环境 docker-compose up -d // 启动环境docker-compose ps使用这条命令查看当前正在运行的环境 打开…

017 - STM32学习笔记 - SPI读写FLASH(二)

016 - STM32学习笔记 - SPI访问Flash&#xff08;二&#xff09; 上节内容学习了通过SPI读取FLASH的JEDEC_ID&#xff0c;在flash资料的指令表中&#xff0c;还看到有很多指令可以使用&#xff0c;这节继续学习使用其他指令&#xff0c;程序模板采用上节的模板。 为了方便起…

Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

Python 算法基础篇&#xff1a;深度优先搜索&#xff08; DFS &#xff09;和广度优先搜索&#xff08; BFS &#xff09; 引言 1. 深度优先搜索&#xff08; DFS &#xff09;算法概述2. 深度优先搜索&#xff08; DFS &#xff09;算法实现实例1&#xff1a;图的 DFS 遍历实例…

MonoDTR Monocular 3D Object Detection with Depth-Aware Transformer 论文学习

论文链接&#xff1a;MonoDTR: Monocular 3D Object Detection with Depth-Aware Transformer 1. 解决了什么问题&#xff1f; 单目 3D 目标检测对于自动驾驶很重要&#xff0c;也很有挑战性。 现有的一些方法通过深度预测网络得到深度信息&#xff0c;然后辅助 3D 检测&…

MySQL约束和查询

约束和查询 1. 约束1.1 约束类型1.2 常用的约束 2. 查询2.1 聚合查询2.1.1 聚合函数2.1.2 GROUP BY2.1.3 HAVING 2.2 联合查询2.2.1 内连接2.2.2 外连接 2.3 合并查询 1. 约束 1.1 约束类型 NOT NULL - 指示某列不能存储 NULL 值。UNIQUE - 保证某列的每行必须有唯一的值。DE…

Python自动获取字母站视频

如果有疑问的话可以在我的谈论群&#xff1a;706128290 来找我 目录 前言 二、编写代码 1.引入库 2.编写主类 3. 自动获取cookies值和生成headers 4.获取命令行参数 运行效果 前言 browser_cookie3 第三方模块 browser_cookie3是browser_cookie模块的分支&#xff0c;…

小白到运维工程师的自学之路 第五十四集 (ansible自动化运维工具)

一、概述 Ansible是一种开源的自动化工具&#xff0c;用于自动化任务的执行、配置管理和应用部署。它采用基于Python编写的简单、轻量级的语法&#xff0c;可以通过SSH协议远程管理和配置多台计算机。 Ansible的主要特点包括&#xff1a; 1、简单易用&#xff1a;设计简单&a…