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

news2025/1/21 22:05:14

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;
			else
				f[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.coloradmin.cn/o/768103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

C#中的抽象类(abstract)

C#中的抽象类&#xff08;abstract&#xff09;。 1&#xff1a;抽象方法只作声明&#xff0c;而不包含实现&#xff0c;可以看成是没有实现体的虚方法 2&#xff1a;抽象类不能被实例化 3&#xff1a;抽象类可以但不是必须有抽象属性和抽象方法&#xff0c;但是一旦有了抽象方…

HTML5学习简记(更新中~)

HTML定义 HTML是一种超文本标记语言&#xff0c;超文本即我们在网页中看到的链接&#xff0c;标记指的是语言中的标签 标签 标签一般成对出现&#xff0c;结束标签比开始标签多一个/ 此外标签一般分为单标签与双标签 HTML基本骨架 其中,HTML标签代表整个网页&#xff0c;hea…

ubuntu迁移anaconda到另外的目录,完美解决问题

背景&#xff1a;anaconda放在/home/下&#xff0c;但是太大了&#xff0c;需要迁移到/data/&#xff0c;找了很多资料&#xff0c;都没解决问题。 一、你可以先做一下尝试&#xff1a; ①拷贝anaconda到你想要的新目录 cp -r /home/anaconda3 /data/ ②将原来的anaconda备…

我国开设大数据相关专业的大学有哪些?

社会对大数据相关专业的人才有着巨大的需求&#xff0c;据预测&#xff0c;到2030年&#xff0c;大数据及相关产业规模达到上万亿元&#xff0c;大数据产业将成为重要的经济增长点。数据是企业最宝贵的资源&#xff0c;大数据分析技术在提升企业经营管理、提高销售业绩、降低管…

微服务组件Sentinel

什么是Sentinel Sentinel 是一种用于流量控制、熔断降级和系统负载保护的开源框架。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员构建可靠和稳定的分布式系统。 Sentinel 提供了以下主要功能&#xff1a; 流量控制&#xff1a;Sentinel 可以通过限制请求的速率或…

怎么学习Java I/O相关的知识和技术? - 易智编译EaseEditing

要学习Java I/O&#xff08;输入输出&#xff09;相关的知识和技术&#xff0c;可以按照以下步骤进行&#xff1a; 理解Java I/O基础知识&#xff1a; 首先&#xff0c;了解Java I/O的基本概念和术语&#xff0c;包括输入流和输出流、字节流和字符流、文件读写等。掌握Java中…

1.12 springboot 整合log4j打印日志

1.除去springboot自带的日志 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><!-- 除去springboot自带的日志 --><exclusion><groupId>org.sprin…

vxe 行编辑自动加载行级别的下级下拉框数据

效果&#xff1a;进入编辑的时候自动根据ID带出下级下拉框 实现思路&#xff1a;行编辑进入之前&#xff0c;调用加载下拉框的方法 activeRowMethod({ row, rowIndex }) {this.getSpecsList(row.wlid);return ret; }, :edit-config"{trigger: click,mode: row,autoClear…

LT8619B 是一款HDMI转TTL或者2 PORT LVDS的芯片。

LT8619B 1. 概述 LT8619B是龙迅基于清除边缘技术的高性能HDMI接收芯片&#xff0c;符合HDMI 1.4&#xff08;高清多媒体接口&#xff09;规范。RGB 输出端口可支持 RGB888/RGB666/RGB565 格式&#xff0c;输出分辨率最高可支持 4Kx2K 分辨率。凭借可编程标量&#xff0c;LT86…

Python爬虫之Scrapy框架系列(23)——分布式爬虫scrapy_redis浅实战【XXTop250部分爬取】

目录&#xff1a; 1.实战讲解&#xff08;XXTop250完整信息的爬取&#xff09;&#xff1a;1.1 使用之前做的完整的XXTOP250项目&#xff0c;但是设置为只爬取一页&#xff08;共25个电影&#xff09;,便于观察1.2 配置settings文件中使用scrapy_redis的必要配置&#xff0c;并…

git -- SSL certificate problem

SSL certificate problem 1.问题描述 新建一个仓库&#xff0c;在向里面上传文件时&#xff0c;出现SSL证书问题 2.解决方法 这个问题是由于没有配置信任的服务器HTTPS验证。默认&#xff0c;cURL被设为不信任任何CAs&#xff0c;就是说&#xff0c;它不信任任何服务器验证。…

概率论的学习和整理--番外12:一个经典dubo模型的概率计算等

目录 1 经典模型知识科普 1.1 知识来源 1.2 下面是摘取的部分规则 2 这个经典dubo的概率和期望 2.1 网上计算的概率&#xff0c;期望全是负&#xff0c;赌徒悲剧 2.2 为什么会这样呢 3 假设把下注庄家不抽水&#xff0c;获得100%收益而不是95&#xff0c;多少次后可以赢…

Java对日志文件进行加密

最近碰到了一个新的需求&#xff0c;生产环境中Java程序部署的服务器会定期清理数据&#xff0c;需要将保存在程序所在服务器上的日志文件挂载到网盘上&#xff0c;但又不想让用户看到日志文件中的信息&#xff0c;因此需要对日志文件中的内容进行加密。 这里&#xff0c;并不是…

详细介绍MATLAB中的图论算法

MATLAB是一种功能强大的编程语言和环境,提供了许多用于图论算法的工具和函数。图论是研究图及其属性和关系的数学分支,广泛应用于计算机科学、网络分析、社交网络分析等领域。在MATLAB中,我们可以使用图论算法来解决各种问题,如最短路径问题、最小生成树问题、最大流问题等…

华为无线ac+ap旁挂二层组网常用配置案例

AC控制器理解配置步骤&#xff1a; capwap source interface Vlanif 100 //源IP回包地址 wlan ssid-profile name test //新建个模版名称为test ssid test //wifi名称 wlan security-profile name test //建立安全模版也叫test security wpa-wpa2 psk pass-phrase admin123 a…

Python 算法基础篇:冒泡排序和选择排序

Python 算法基础篇&#xff1a;冒泡排序和选择排序 引言 1. 冒泡排序算法概述2. 冒泡排序算法实现实例1&#xff1a;冒泡排序 3. 选择排序算法概述4. 选择排序算法实现实例2&#xff1a;选择排序 5. 冒泡排序与选择排序的对比总结 引言 冒泡排序和选择排序是两种常用的排序算法…

使用java创建图片文字模版

场景:公司员工生日到了,给过生日的同事发送邮件附带图片祝福 以下是生成图片模版的代码 package com.yujie;import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO;public class ImageMergeExample {public static vo…

第十五 rabbitmq及数据同步

0.学习目标 了解常见的MQ产品 了解RabbitMQ的5种消息模型 会使用Spring AMQP 利用MQ实现搜索和静态页的数据同步 1.RabbitMQ 1.1.搜索与商品服务的问题 目前我们已经完成了商品详情和搜索系统的开发。我们思考一下&#xff0c;是否存在问题&#xff1f; 商品的原始数据保…

C++ 第三讲

1 >手动封装一个顺序栈类(数据元素为整形)&#xff0c;要求私有成员属性:堆区空间的指针&#xff0c;用于存放数据&#xff0c;和一个指向栈顶元素的变量 main.cpp #include "zuoye.h"int main() {//实例化对象My_stack Stck;My_stack &st Stck;//入栈Stck…