当前位置: 首页 > news >正文

Acwing 897. 最长公共子序列 (每日一题)

最长公共子序列

题目描述

给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。
输入格式

第一行包含两个整数 N和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。
输出格式

输出一个整数,表示最大长度。
数据范围

1≤N,M≤1000

输入样例:

4 5
acbd
abedc

输出样例:

3

状态表示:

集合:所有从A[1,i] B[1,j]的公共子序列的集合

属性max

像最长上升子序列,状态的划分依据是找不同的点。最长上升子序列确定以a[i]为结尾的子序列,共同点便是以a[i]作为结尾。划分依据:a[1,i-1]中的每个数作为最后一个不同点进行划分**
有没有发现:

DP基操:

1.找不同和相同之处/不同和固定之处
2.结合定义出发!
最长公共子序列的不同点在于i,j在不在序列中,可以将集合划分为4类。
实际上只有3类,且往下看。
(1)i、j 均不在

i、j均不包含其中,那只能从a[i-1]、b[j-1]中去选
得到如下状态转移方程:
f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] f[i][j]=f[i-1][j-1] f[i][j]=f[i1][j1]
(2)
i不在,
j

i不在序列中,只能从前i-1中选,j可在可不在

刚好i不在,j在,包含在这种情况中且最大值/最小值是可以允许重复的
得到如下状态转移方程:
f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j]=f[i-1][j] f[i][j]=f[i1][j]
(3)i在,j不在

j不在序列中,那j只能从j-1中选择。i可在可不在

刚好**i在,j**不在,包含在这种情况中,且最大值/最小值是可以允许重复的。
得到如下状态转移方程:
f [ i ] [ j ] = f [ i ] [ j − 1 ] f[i][j]=f[i][j-1] f[i][j]=f[i][j1]

(4)i、j均在

只有满足**a[i]==b[j]这一条件才存在。

确定了**a[i]、b[j]之后,剩下的从i-1、j-1中选出最长公共子序列,从定义出发,恰好就是f[i-1][j-1]中选。最后再加上固定好的a[i]、b[j]这一对即可。
得到如下状态转移方程:
f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + 1 f[i][j]=f[i-1][j-1]+1 f[i][j]=f[i1][j1]+1
最后,
(1)是既可以包含在(2)也可以包含在(3)中的,允许最值重复重复没关系,求出的必定是最值且包含在整个集合中,是合法的。最后,总共只有3种情况。

求和/求值则不允许重复!!!

Accode

import java.util.*;
public class Main{static int N=1010;static int f[][]=new int[N][N];public static void main(String []args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();char a[]=(" "+sc.next()).toCharArray();char b[]=(" "+sc.next()).toCharArray();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){//情况1包含在情况2、3中//情况2、3取一个maxf[i][j]=Math.max(f[i-1][j],f[i][j-1]);//满足a[i]==b[j]这一条件//再与情况4取一个maxif(a[i]==b[j])f[i][j]=Math.max(f[i][j],f[i-1][j-1]+1);}}//输出集合定义System.out.println(f[n][m]);    }
}

往期回顾

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯省一你一定不能错过的模板大全(第三期)

蓝桥杯省一你一定不能错过的模板大全(第四期)!!!

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

蓝桥杯每日N题 (消灭老鼠)

蓝桥杯每日N题(杨辉三角形)

蓝桥杯每日N题 (砝码称重)

蓝桥杯上岸每日N题(鸡尾酒)

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)

蓝桥杯上岸必背!!!(第八期 简单数论)

蓝桥杯上岸必刷!!!(进制、数位专题)

蓝桥杯上岸考点清单 (冲刺版)!!!

蓝桥杯上岸必背模板 (纯享版)

http://www.lryc.cn/news/151151.html

相关文章:

  • CSS中border-radius的来美化table的实战方案
  • 移除链表元素_每日一题
  • spring boot + Consul 示例 (Kotlin版)
  • Git企业开发控制理论和实操-从入门到深入(四)|Git的远程操作|Gitee
  • SpringCloudAlibaba Gateway(二)详解-内置Predicate、Filter及自定义Predicate、Filter
  • 调用chat-gpt
  • Element组件浅尝辄止6:Dialog 对话框组件
  • Bert和LSTM:情绪分类中的表现
  • 【面试经典150题】跳跃游戏
  • 【Rust】003-基础语法:流程控制
  • 0829【综述】面向时空数据的区块链研究综述
  • MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)
  • YOLOV8模型使用-检测-物体追踪
  • springmvc:设置后端响应给前端的json数据转换成String格式
  • Mac安装brew、mysql、redis
  • MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s)
  • Unity 之 参数类型之值类型参数的用法
  • VScode远程连接主机
  • 【iOS】属性关键字
  • 【计算机基础】Git从安装到使用,详细每一步!扩展Github\Gitlab
  • 深入了解Docker镜像操作
  • 嵌入式开发-单片机学习介绍
  • 5、Spring之Bean生命周期源码解析(销毁)
  • 开发多点触控MFC应用程序
  • 使用nlohmann json库进行序列化与反序列化
  • 高教社杯数模竞赛特辑论文篇-2012年A题:葡萄酒的评价(附获奖论文)
  • 手写RPC——数据序列化工具protobuf
  • 【MATLAB第70期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入单输出回归预测及多分类预测模型(全网首发)
  • Linux进程间通信的几种方式
  • Android 13.0 Launcher3定制之双层改单层(去掉抽屉式一)