最长公共子序列

news2024/12/26 2:30:57

最长公共子序列

  • 一、题目
  • 二、思路
      • 1、状态转移方程
        • (1)状态表示
        • (2)状态转移
      • 2、循环设计
  • 三、代码

一、题目

在这里插入图片描述

二、思路

这道题是一个很经典的DP问题,那么我们来看一下如何分析。

DP问题我们需要考虑两个问题:第一个问题就是状态转移方程的书写,第二个问题就是我们如何去设计循环。

第一个问题的作用是有效地实现状态之间的转移,第二个问题的作用是保证我们能够从小到大,不重不漏的枚举出每一个子问题。

1、状态转移方程

(1)状态表示

状态的表示一个关键因素就是能够表示这个问题的规模大小
由于这道题设计到了两个字符串,那么我们利用 f ( i , j ) f(i,j) f(i,j)来表示, f ( i , j ) f(i,j) f(i,j)的意思是,从左向右看,以第 i i i个字母结尾的字符串1和以第 j j j个字母结尾的字符串2之间最长的公共子序列长度。而这个长度要存储在二维数组 f [ i ] [ j ] f[i][j] f[i][j]中。

(2)状态转移

状态转移的目的是利用子问题间接地去解决问题
根据我们的状态表示,我们只知道每个字符串的最后一个字符。那么我们就从此入手。

对于最长公共子序列而言,其实无非就4种情况,要么肯定不包含字符串1中的第 i i i个字母,要么肯定不包含字符串2中的第 j j j个字母,要么肯定不包含两个字母,要么肯定都包含。两个都包含的话其实是有前提的,那么就是 s t r 1 [ i ] = s t r 2 [ j ] str1[i]=str2[j] str1[i]=str2[j],如果已经确定了我们要选最后一个字符的话,我们第四种情况就可以写成: f [ i ] − 1 [ j − 1 ] + 1 f[i]-1[j-1]+1 f[i]1[j1]+1

那么我们怎么知道这四种情况哪个是最长的呢?我们只需要比较一下求一下最大值即可。

那么我们此时来考虑一下,这几个情况之间是否有重合的部分呢?其实是有的。

我们以 f [ i ] [ j ] f[i][j] f[i][j]为例,按照刚刚的思路我们需要比较的是: f [ i − 1 ] [ j − 1 ] f[i-1][j-1] f[i1][j1] f [ i − 1 ] [ j ] f[i-1][j] f[i1][j] f [ i ] [ j − 1 ] f[i][j-1] f[i][j1] f [ i − 1 ] [ j − 1 ] + 1 f[i-1][j-1]+1 f[i1][j1]+1
我们分类的方式是肯定不包含某个字母,但是另一个字母是可能包含可能不包含,是否包含的情况其实根据两种情况下的公共序列长度而定的,也就是说我们在分析 f [ i − 1 ] [ j ] f[i-1][j] f[i1][j] f [ i ] [ j − 1 ] f[i][j-1] f[i][j1]这两种情况的时候,就已经考虑到了 f [ i − 1 ] [ j − 1 ] f[i-1][j-1] f[i1][j1]的情况。

因此我们只需要考虑最后三种情况

那么我们的状态转移方程可以写成

f ( i , j ) = { m a x ( f ( i , j − 1 ) , f ( i − 1 , j ) ) i ≠ j m a x ( f ( i , j − 1 ) , f ( i − 1 , j ) , f ( i − 1 , j − 1 ) + 1 ) i = j f(i,j)= \begin{cases} max\big(f(i,j-1),f(i-1,j)\big)&i\neq j\\ max\big(f(i,j-1),f(i-1,j),f(i-1,j-1)+1\big)&i=j\\ \end{cases} f(i,j)={max(f(i,j1),f(i1,j))max(f(i,j1),f(i1,j),f(i1,j1)+1)i=ji=j

2、循环设计

我们的外层循环设计为一个字符串长度,第二层循环设计为另一个字符串的长度。这样我们就能逐步地扩大问题规模。

这种循环设计是很常用的。比如背包问题中,我们就经常这样设计。

三、代码

#include<iostream>
using namespace std;
const int N=1e3+10;
int f[N][N];
int n,m;
char s1[N],s2[N];
int main()
{
    cin>>n>>m;
    scanf("%s%s",s1+1,s2+1);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            f[i][j]=max(f[i][j-1],f[i-1][j]);
            if(s1[i]==s2[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
        }
    }
    cout<<f[n][m]<<endl;
}

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

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

相关文章

【Javassist】快速入门系列11 当检测到显示类型转换时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

深度剖析钓鱼网站域名识别工具dnstwist

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

漫途设备远程运维平台在制造业中的应用!

我国正处于从制造大国向制造强国迈进的关键时期&#xff0c;制造业的数字化、网络化、智能化以及绿色制造体系&#xff08;双碳为代表&#xff09;的打造事关制造业全局&#xff0c;是制造业高质量、可持续发展的关键与重要着力点。而设备智能运维是智能制造行业的短板。 存在以…

回归童年的美好 守住童年的回忆 那些年你玩过的游戏都有呢

时过迁境&#xff0c;曾经与我们一同玩耍的发小、同学&#xff0c;也因为工作、家庭原因早已各奔东西不在自己的身边。 还依稀记得孩童时期和小伙伴们一同蹲在大头电视前&#xff0c;快乐的玩着红白机的魂斗罗、超级玛丽还有炸弹人。稍微长大后&#xff0c;家里有了大头显示器…

ArcGIS基础实验操作100例--实验19按值修改栅格值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验19 按值修改栅格值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

Winsock套接字开发网络聊天室实例(C/S)模式

聊天室的基本要求 聊天器采用客户端/服务器&#xff08;C/S&#xff09;模式&#xff1b; 1&#xff0c;客户端利用UDP与服务器连接&#xff0c;客户端与客户端之间通过UDP互相通讯&#xff1b; 2&#xff0c;服务器端具有服务器端口设置&#xff0c;维护客户端个人信息&#…

SQL INNER JOIN:内连接

INNER JOIN 是 SQL 中最重要、最常用的表连接形式&#xff0c;只有当连接的两个或者多个表中都存在满足条件的记录时&#xff0c;才返回行。 SQL INNER JOIN 子句将 table1 和 table2 中的每一条记录进行比较&#xff0c;以找到满足条件的所有记录&#xff0c;然后将每一对满足…

YGG 公会发展计划(GAP)第二季总结

Yield Guild Games&#xff08;YGG&#xff09;正在结束其公会发展计划&#xff08;GAP&#xff09;的第二季&#xff0c;这是一个成就驱动的社区代币分配协议&#xff0c;奖励 YGG 成员通过优质贡献为公会提供价值。 第二季的 GAP 包括 117 个任务式的「成就」&#xff0c;为了…

有向图的概念和java代码实现

有向图定义 有向图是一副具有方向性的图&#xff0c;是由一组顶点和一组有方向的边组成的&#xff0c;每条方向的边都连着一对有序的顶点。 出度&#xff1a; 由某个顶点指出的边的个数称为该顶点的出度。 入度&#xff1a; 指向某个顶点的边的个数称为该顶点的入度。 有向路径…

重学redux之Redux Toolkit(四)

更新第四篇了,这篇是最终篇,没有基础的最好看看前几篇,篇幅有限,更多的是一个指导,如果有不清楚的地方,可评论区留言(最好自己找度娘问问),引用官方说话,先来了解一下 redux toolkit 是什么东西 Redux Toolkit 是什么? Redux Toolkit 是 Redux 官方强烈推荐,开箱…

用JavaScript实现网页雪花飘落特效

不知道大家有没有看到过别人的网页有雪花飘落的特效&#xff0c;我当时看到真的觉得好好看&#xff0c;于是乎就去借鉴别人做的特效代码&#xff0c;最终将这个特效成功放到自己做的网页上啦~代码放到下面啦&#xff0c;可以自己设置颜色&#xff0c;雪花形状的大小&#xff0c…

新政策|“信息科技”独立设置为新科目

近日&#xff0c;教育部印发义务教育课程方案和语文等16个课程标准(2022年版)。今天&#xff0c;教育部召开新闻发布会&#xff0c;介绍《义务教育课程方案和课程标准&#xff08;2022年版&#xff09;》。 教育部教材局局长田慧生表示&#xff0c;现行义务教育课程方案和课程…

Eth 02 -MAC如何访问PHY

文章目录 1 MII接口概述2 MDIO clause 223 MDIO Clause 45传送门 ==>> AutoSAR入门和实战系列总目录 1 MII接口概述 我们在【Eth 01 - Eth以太网控制器驱动概述和API讲解】已经提到了两个接口:MAC通过MII接口访问PHY芯片。 void Eth_WriteMii(uint8 CtrlIdx, uint8 T…

第二十三讲:神州路由器OSPF多区域路由的配置

实验拓扑图如下所示 操作步骤&#xff1a; 步骤1&#xff1a;连接网络拓扑图。 步骤2&#xff1a;设置计算机的IP地址、子网掩码和网关。 步骤3&#xff1a;配置Router-A的名称及其接口IP地址。 Router_config#hostname Router-A Router-A_config#int fa0/0 Router-A_con…

【HTML】再见2022!一起来写一个响应式跨年倒计时吧(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

excel排序求和:如何统计前几名数据合计 上篇

什么叫做统计前几名合计呢&#xff1f;先看看动画演示吧&#xff1a; 可以看到&#xff0c;数据按照销售数量从高往低排列&#xff0c;选择一个名次&#xff0c;就可以对前几名的销售数量求和。 这类问题在很多与数字排名有关的情况下都用得上&#xff0c;例如对前几名考试成绩…

GitFlow工作流

1.背景介绍 什么是Git工作流&#xff1f; Git工作流你可以理解为工作中团队成员遵守的一种代码管理方案&#xff0c;在Git中有以下几种工作流方案作为方案指导。 1、集中式工作流 2、功能分支工作流 3、Gitflow工作流 4、Forking工作流 2.知识剖析 1、集中式工作流 这…

ANR系列之五:Service类型ANR原理讲解

前言&#xff1a; ANR系列文章一共有有若干篇&#xff0c; 遵循这样的一个顺序&#xff1a; 1.先讲ANR的基本概念以及发生后的流程&#xff1b; 2.四种类型的ANR是如何发生的&#xff1b; 3.该如何排查和解决ANR类型问题。 想看整个系列的文章&#xff0c;可以参考该系列…

在线文档查看器:Gleamtech Document Viewer 6.6.1

DocumentUltimate Document Viewer and Converter for ASP.NET Core, MVC 和 WebForms 查看几乎任何文档类型&#xff08;70 多种文件格式&#xff0c;包括 PDF 和 Microsoft Office&#xff09;。 HTML5 零足迹查看器。在文档类型之间转换。 特征 适用于桌面和移动浏览器的通…

【XR】为挑战性环境优化6DoF控制器追踪

Oculus分享&#xff1a;为挑战性环境优化6DoF控制器追踪 尤其是针对具有挑战性的追踪环境 映维网曾在九月和十一月分享了关于Oculus Constellation追踪系统的相关细节&#xff0c;其中负责AR/VR设备输入追踪的Facebook工程经理安德鲁梅利姆&#xff08;Andrew Melim&#xff…