首页 > 其他分享 >最长公共子序列

最长公共子序列

时间:2023-08-12 22:45:08浏览次数:34  
标签:不选 转移 leq 公共 序列 最长

最长公共子序列

题目描述

给定长度为 \(n\) 的数组 \(a\),长度为 \(m\) 的数组 \(b\),求其最长公共子序列长度


DP

\(f[i][j]\) 表示 \(a\) 前 \(i\) 项和 \(b\) 前 \(j\) 项的最长公共子序列长度

因为如果我们要在序列尾巴上加元素是不跟前面选了什么有关系的,所以没有后效性,珂以 DP

很显然我们可以选择不选 \(a_i\),所以可以转移 \(f[i-1][j]\)

我们亦可以不选 \(b_j\),所以可以转移 \(f[i][j-1]\)

如果要选 \(a_i\) 和 \(b_j\) 的话,必须满足 \(a_i=b_j\),因为是公共子序列,我们将 \(a_i\) 和 \(b_j\) 加进去,所以可以转移 \(f[i-1][j-1]+1\)

对于既不选 \(a_i\) 也不选 \(b_j\) 的状态,可以不用转移,因为肯定不会优于第三种,也已经在第一第二种中转移过了

综上,有

\[f[i][j]=max\{f[i-1][j],f[i][j-1],f[i-1,j-1]+1\} \]

其中第三个状态要满足 \(a_i=b_j\) 才能转移,\(1\leq i\leq lena,1\leq j\leq lenb\)

初始化 \(f[i][0]=0,f[0][j]=0\),目标是 \(f[lena][lenb]\)

code

for(int i=1; i<=n; ++i)
	for(int j=1; j<=m; ++j) {
		f[i][j]=max(f[i-1][j],f[i][j-1]);
		if(a[i]==b[j])
			f[i][j]=max(f[i][j],f[i-1][j-1]+1);
	}

标签:不选,转移,leq,公共,序列,最长
From: https://www.cnblogs.com/chelsyqwq/p/17625719.html

相关文章

  • 最长上升子序列
    最长上升子序列题目描述给定一个长度为\(n\)的数列\(a\),求其最长上升子序列长度DP\(O(n^2)\)\(f[i]\)表示以\(i\)结尾的最长上升子序列显然有\(f[i]=max(f[i],f[j]+1)\)其中\(1\leqi\leqn,1\leqj\leqi,f[0]=0,f[n]\)即为所求codefor(inti=1;i<=n;++i)......
  • 【图论】最近公共祖先(LCA)
    什么是LCA最近公共祖先是相对于两个节点来说的,顾名思义,最近公共祖先即为两个节点公共的最近的祖先。如上图,\(86\)和\(67\)的\(LCA\)是\(75\),\(67\)和\(27\)的\(LCA\)是\(50\)。怎么求LCA倍增法我们先想想暴力怎么做:从这两个节点开始,一步一步往上跳,直到跳到了一......
  • URLDNS的反序列化调试分析
    Java反序列化(0):URLDNS的反序列化调试分析URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。一.Java反序列化前置知识Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject......
  • P1631 序列合并[优先队列]
    P1631序列合并这个没做出来属实有些惭愧。看了题解觉得很妙。如果直接想的话可能反而很麻烦题目是给两个n个数的不下降序列,问这两个序列任意各取出一个后相加的最小的n个数是什么。直接贴题解吧题解P1631【序列合并】一共会产生n*n个数,a[1]+b[1]<=a[1]+b[2]........<=a[1......
  • 力扣-最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。 提示:1<=st......
  • 百度人脸识别授权序列号-设备时间复原问题
    Q:为什么单设备授权序列号失效?A:以下情况都有可能导致序列号失效,请您进行一-排查1.测试序列号过期,请在百度智能云管理后台申请更多测试序列号2.CPU、网卡等硬件损坏导致硬件指纹变更3.已经激活的设备硬件变更4.SDK升级:安卓1.0&2.0版本升级至3.0&4.0&5.0版本会导......
  • 《剑指Offer》-48-最长不含重复字符串的子字符串
    这题以前做过,和力扣-3重复 intlengthOfLongestSubstring(strings){ //本来应该是用map,但是其实可以使用数组替代,下标对应了字母 unordered_map<char,int>map; intlen=s.size(),maxLen=0;//初始化为0是因为可能字符串长度为0 vector<int>dp(len+1,0);//多......
  • [oeasy]python0083_[趣味拓展]字体样式_正常_加亮_变暗_控制序列
    字体样式回忆上次内容上次了解了一个新的转义模式\033逃逸控制字符escesc退出标准输出流进行控制信息的设置可以清屏也可以设置光标输出的位置还能做什么呢?可以设置字符的颜色吗???......
  • [oeasy]python0083_[趣味拓展]字体样式_正常_加亮_变暗_控制序列
    字体样式回忆上次内容上次了解了一个新的转义模式\033逃逸控制字符esc esc让输出退出标准输出流进行控制信息的设置可以清屏也可以设置光标输出的位置  还能做什么呢?可以设置字符的颜色吗???......
  • prefur序列及Cayley公式
    一.写在前面p.s学习自https://www.cnblogs.com/dirge/p/5503289.html二.prefur序列1.由无根树生成prefur序列首先定义无根树中度数为1的节点是叶子节点。找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只剩下2个节点。2.由prefur序列生成无根树设点集......