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

这篇具有很好参考价值的文章主要介绍了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种情况。文章来源地址https://www.toymoban.com/news/detail-694328.html

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

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取一个max
                f[i][j]=Math.max(f[i-1][j],f[i][j-1]);
                //满足a[i]==b[j]这一条件
                //再与情况4取一个max
                if(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)

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

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

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

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

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

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

到了这里,关于Acwing 897. 最长公共子序列 (每日一题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最长公共子序列和最长公共子串

    最长公共子序列 题目描述 给出1,2,…, n 的两个排列P 1 和 P 2 ,求它们的最长公共子序列。 输入格式 第一行是一个数 n 。 接下来两行,每行为 n 个数,为自然数1,2,…, n 的一个排列。 输出格式 一个数,即最长公共子序列的长度。 题目分析 第一阶段定义dp数组 (1)考虑规模

    2024年02月19日
    浏览(39)
  • 最长公共子序列(详细代码 注释 分析 以及求出最长公共子序列内容方法)

    文章有些长,希望能够耐心看完,并且对你有帮助,文章是自己看了书之后,总结的,如果有什么错误的地方,欢迎指出。 一些基本的概念: 子序列: 原序列中删除若干个元素得到的序列,即原序列中可以不连续的一段 子串: 原序列中任意个连续的序列元素组成的序列,

    2023年04月15日
    浏览(51)
  • 蓝桥杯上岸每日N题 (交换瓶子)

    有 N 个瓶子,编号 1∼N,放在架子上。 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置。 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的情况,显然,至少需要交换 2 次就可以复位。 如果瓶子更多呢?你可以通过编程来解决。 输入格式 第一

    2024年02月11日
    浏览(46)
  • 蓝桥杯上岸每日N题 (修剪灌木)

    爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。 爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。 爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。 当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修

    2024年02月11日
    浏览(37)
  • 【算法训练-字符串 三】最长公共子串、最长公共子序列

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【】,使用【】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个地方都出现过才做

    2024年02月09日
    浏览(40)
  • 蓝桥杯上岸每日N题第一期(二)!!!

    这道题我们可以得出的是二分的结果是满足k块巧克力的最大边长是多少? 题目要求: 1.形状是正方形,边长是整数 2.大小相同 即要求边长均为x 我们就可以确保得到 边长一致的正方形 大小相同即分出的块数为整数, 向下取整!!! 得到能够凑出的整块巧克力 如果分出的块

    2024年02月16日
    浏览(39)
  • 蓝桥杯上岸每日N题 第一期(一)!!!

    2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到

    2024年02月16日
    浏览(43)
  • 蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

    要尽可能减少花费--递归的分支尽可能少--优先考虑放重猫 优先考虑放重猫 ,需要从 大到小排个序 , 一直往下搜索,答案是唯一的。 放得下猫就 继续往该车往下加 放不下就再 另外开一辆放猫 分两个分支去放 开一辆继续放其他猫的为一个分支 开另一辆单独只放一只猫的为

    2024年02月14日
    浏览(71)
  • AcWing 5050. 排序 (每日一题)

    给定一个长度为 n 的由小写字母构成的字符串。 请你按照 a∼z 的顺序,对字符串内的字符进行重新排序,并输出重新排序后的字符串。 输入格式 第一行包含整数 T ,表示共有 T 组测试数据。 每组数据第一行包含整数 n 。 第二行包含一个长度为 n 的由小写字母构成的字符串

    2024年02月11日
    浏览(36)
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出

    2024年02月01日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包