首页 > 其他分享 >LCS 问题

LCS 问题

时间:2024-06-21 12:31:34浏览次数:20  
标签:LCS int 问题 MAXN 序列 include dp

LCS 问题

LCS,即最长公共子序列。

1. 朴素的求法

使用动态规划,\(dp_{i,j}\) 代表以序列 \(a\) 第 \(i\) 个字母结尾,序列 \(b\) 第 \(j\) 个字母结尾的 LCS 长度。得动态转移方程:

\[dp_{i,j} = \left\{\begin{matrix} \max(dp_{i-1,j},dp_{i,j-1}) & a_i \ne b_j\\ dp_{i-1,j-1} & a_i = b_j \end{matrix}\right. \]

Code1

#include <iostream>
using namespace std;
#define MAXN 10005
int f[MAXN][MAXN];
int a[MAXN],b[MAXN];
int main()
{
	int n;
	cin>>n;
	int m=n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1;
			else f[i][j]=max(f[i][j-1],f[i-1][j]);
		}
	}
	cout<<f[n][m];
	return 0;
}

时间复杂度:\(O(n^2)\)。

2. 优化处理

考虑使用 LIS 解决 LCS。

因为两个序列都是 \(1 \sim n\) 的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个 \(map\) 数组将 \(a\) 序列的数字在 \(b\) 序列中的位置表示出来。

因为最长公共子序列是按位向后比对的,所以 \(a\) 序列每个元素在 \(b\) 序列中的位置如果递增,就说明 \(b\) 中的这个数在 \(a\) 中的这个数整体位置偏后,可以考虑纳入 LCS,那么就可以转变成时间复杂度为 \(O(n \log n)\) 的求用来记录新的位置的 \(map\) 数组中的 LIS!(代码展示的仅是洛谷 P1439 的代码,有一定局限性【仅为 \(a,b\) 中没有重复项时】)

Code2

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
#define MAXN 100005 
int a[MAXN],b[MAXN],c[MAXN];
unordered_map<int,int> mp;
vector<int> vec;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++) cin>>b[i];
	for(int i=0;i<n;i++) mp[a[i]]=i;
	for(int i=0;i<n;i++) c[i]=mp[b[i]];
	for(int i=0;i<n;i++)
    {
        int tem=lower_bound(vec.begin(),vec.end(),c[i])-vec.begin();
        if(tem==vec.size())
            vec.push_back(c[i]);
        else vec[tem]=c[i];
    }
    cout<<vec.size();
	return 0;
}

练习

标签:LCS,int,问题,MAXN,序列,include,dp
From: https://www.cnblogs.com/zhangyuyi1218/p/18260285

相关文章

  • 解锁测试管理的核心问题,提升你的管理实力!
    如何打造积极向上,主动,执行力强,不推诿,不甩锅,服从安排,和谐,互帮互助的团队?如何有效的追踪团队的测试效率,后续对测试时间,质量等评估做支持?作为测试管理的你,是不是会遇到各种问题,不知道如何处理?霍格沃兹测试开发学社于本周六组织了测试管理圆桌讨论会 。本次邀请了多位名企测试管理......
  • Tcp粘包半包问题(现实场景举例帮助理解)
    理解粘包问题时,我们可以将这个过程想象得更加生活化一些。想象你正在经营一家水果拼装店,你的任务是接收来自不同客户的水果订单,并将这些水果按照订单要求重新组装起来。每份订单中的水果都事先被切成了便于快递的“水果片”,并通过同一条传送带送过来。现在,你收到了两份订单,一......
  • 数位统计DP——AcWing 338. 计数问题
    数位统计DP定义数位DP(DigitalDP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。运用情况统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。计算......
  • Python 学习 第三册 第12章 图的最优化问题
    ----用教授的方式学习。目录12.1图的最优化问题12.1.1最短路径:深度优先搜索和广度优先搜索12.1图的最优化问题我们下面研究另一种最优化问题。假设你有一个航空公司航线的价格列表,其中包括美国任意两个城市之间的航班价格。假设有3个城市A、B和C,从A出发经过B到达C的价格......
  • 解决页面刷新后firefox浏览器中iframe内容不更新的问题
    最近遇到了一个问题:使用firefox浏览切换2层iframe下的某个页面后iframe内容未更新,Chrome和Edge浏览器并无这个问题。在这个项目中,最外层的iframe用于隐藏url,里层的iframe用于给不同参数的url提供一个统一地址以便于权限路由等控制。 由于项目比较复杂,用简单的代码很难去复现这个......
  • 【转载】解决使用 git 时出现unable to access “xxx‘: error settingcertificate ve
    1、出现原因:在使用idea的时候,进行git下的push,出现下面的错误:2、原因分析:检查idea中git的安装位置是否发生了变化3、解决方案:找到git的安装路径,双击打开git-bash.exe进行输入:gitconfig--systemhttp.sslverifyfalse问题解决!!!......
  • svg标签内容导出为svg文件问题
     原本的代码://大概代码层级//html代码<divref="svgContainer"><div>//js代码//1、div中添加svgconstsvg=d3.select(svgContainer.value).append("svg).attr("id",svgElement").attr("xmlns","http://www......
  • Windows11系统win32ui.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个win32ui.dll文件(挑选合适的版本文件)把它放......
  • Windows11系统WESL_ShellLauncher.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个WESL_ShellLauncher.dll文件(挑选合适的版本......
  • BaseHref 以及前端路由的问题
    BaseHref以及前端路由的问题BaseHref是什么?MDN,说的直白一点就是,这个站点里面所有的访问主站的资源文件,都会在路由前面加上这个basehref,包括*js,scss,image,ajax,......**。如果一个DOM里面有多个这样的base,只有第一个会起作用。BaseHref在Angular工程的编译中有......