最大公共子序列

动态规划(最大公共子序列) 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被 阅读详情
最大公共子序列
2.子问题的递归结构
设X={x1,x2,x3,...,xn}和Y={y1,y2,y3,...,yn}的最长公共子序列,可按以下方式递归计算:当xm=yn时,找出xm-1和yn-1的最长子序列,然后在其尾部加上xm(=yn)即可得X和Y的最长公共子序列。当xm<>yn时,必须解两个子问题,即找出xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的最长公共子序列。
由此递归结构容易看出最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。
首先建立子问题最优值的递归关系。用c[i][j]记录序列Xi和Yj的最长公共子序列的长度。其中,Xi={x1,x2,x3,...,xi};Yj={y1,y2,y3,...,yj}。当i=0,j=0时,空序列是Xi和Yi的最长公共子序列,故此时c【i】【j】 = 0 。在其他的情况下,由最优子结构性质(当为题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质)可建立递归关系如下:

 0                         i= 0,j =0

c【i】【j】=               c【i-1】【j-1】+1          i,j>0;xi=yj

                          Max { c[i][j-1],c[i-1][j] }    i,j>0;xi<>yj

3.计算最优值。
    c【i】【j】存储Xi和Yi的最长公共子序列的长度,b【i】【j】记录c【i】【j】的值是哪一个子问题的解得到的,这在构造最长公共子问题序列时要用到。问题的最优值,记X和Y的最长公共子序列的长度记录于c【m】【n】中。
4.构造最长公共子序列
    首先从b 【 m 】【 n 】 开始,以其值在数组b中搜索。当b【i】【j】 =1 时 , 表示Xi和Yj的最长公共子序列由Xi-1和Yj-1的最长公共子序列在尾部上加xi所得到的子序列.......……

算法设计例题:最长公共子序列(DP)

memory limit: 65536KB    time limit: 500MS

accept: 24    submit: 77

Description

一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列 X = { x1,x2,…,xm },则另一序列Z={ z1,z2,…,zk },X的子序列是指存在一个严格递增下标序列{ i1,i2,…,ik },使得对于所有 j = 1,2,…,k ,有 zj = xij

给出两个字符序列X和Y,求出它们的最长公共子序列。

Input

输入的第一行为测试样例的个数T( T < 40 ),接下来有T个测试样例。每个测试样例的第一行是字符串X,第二行是字符串Y。X和Y只包含大写字母,且长度不大于1000。

Output

对应每个测试样例输出一行,只有一个整数,表示字符串X和字符串Y的最长公共子序列的长度。

Sample Input

2
ABCDE
ACE
AAABBBCCC
AABBCC

Sample Output

3
6



#include"iostream"
#include<stdio.h>
using namespace std ;

class Element {
    public :

    int LcsLength (char x[],int xn , char y[], int yn , int b [1000][1000] )
    {
        int m = xn  ;
        int n = yn ;
        int c[1000][1000]  ;
        int i  ;
        int j;
        for (  i =1 ; i <= m ; i++ )
            c[i][0] = 0 ;
        for(i =1 ; i <=n ; i++ )
            c[0][i] = 0 ;
        for (  i =1 ; i <= m ; i++ )
            for(  j=1 ; j <= n ; j++ )
            {
                if( x[i] == y [j] )
                {
                     c[i][j] = c [ i-1 ] [ j-1 ] + 1 ;
                     b [i] [j] = 1 ;
                }
                else if( c [ i-1 ][j] >= c[ i ][ j-1 ]) {
                    c [ i ] [ j ] = c[i-1][j];
                    b [i] [j] =2 ;
                }
                else {
                    c[ i ][ j ] = c[ i  ] [ j -1 ];
                    b [ i ] [ j ] = 3 ;
                }
            }

            return c [ m ][ n ] ;
    }

    void Lcs(int i , int j , char x[] , int b [1000][1000])
    {
        if( i == 0 || j ==0 )
            return;
        if( b[i][j] == 1 )
        {

            Lcs ( i-1 , j-1 , x , b );
             cout<<x[i];
        }else if ( b[i][j] ==2 ){
            Lcs( i -1 , j , x , b );
        }else {
            Lcs( i  , j -1  , x , b );
        }
    }
};

int main()
{
    Element e ;
    int T  ;
    char x [1000] ;
    char y [1000] ;
    int xn  ;
    int yn  ;
    int b [1000][ 1000 ] ;
    cin>>T;
    while( T > 0 )
    {
        xn = 1 ;
        yn = 1 ;
        cin>>(x+1);
        cin>>(y+1);
        while(x[xn]!='\0')
        {
            xn++;
        }
        xn--;
        while(y[yn]!='\0')
        {
            yn++;
        }
        yn--;
        cout<<e.LcsLength(x,xn,y,yn,b)<<endl;
        T--;
    }
    return 0 ;
}


宇瞳杯安防镜头设计 阅读详情

相关推荐

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

最长公共子序列

枯木逢春不再茂,年少且惜镜边人 今天学习了最长子序列的长度和路径判断 #include<stdio.h> #include<string.h> int dp[100][100],book[100][100]; char a[100],b[100]; void print(int m,int n) { if(m==0||n==0) return ; if(book[m...

WOF_Spark的博客 256

Lumerical Python API实战指南(一)——从数据优化到自动化工作流

本文是Lumerical Python API实战指南,旨在帮助用户从繁琐的手动仿真操作转向智能自动化工作流。文章详细介绍了API环境的零基础搭建、核心操作(会话管理、命令执行与数据交换),并通过参数扫描与自动化分析流水线的实战案例,展示了如何利用Python脚本实现从数据优化到自动化仿真的全过程,显著提升光子设计效率。

xxx12的博客 567

最长公共子序列(LCSubstring)和最长公共子串(LCSunsequence)问题

动态规划(dynamic programming)

prettysky123的专栏 419

别再用UE5默认材质:用Substance Painter一招提升写实感

今天,我就把这套从模型准备到引擎最终呈现的全流程技巧毫无保留地分享出来,这套方法不仅能让你的作品细节炸裂,更能让你理解次世代PBR(Physically Based Rendering)材质的底层逻辑。

海外旅居设计师,15年设计经验。 1324

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5483

51nod_1006 最长公共子序列,输出路径【DP】

题意: 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。 输出最长的子序列,如果有多个,随意输出1个。 思路: DP,同时DP记录路径。 代码: string a,b; int...

weixin_30532759的博客 522

基于FPGA进位链的TDC高精度延时链设计与实现

本文详细介绍了基于FPGA进位链的高精度TDC延时链设计与实现方法。通过利用FPGA的CARRY4硬件资源,构建了理论分辨率达13.25ps/级的延时链,并提供了Verilog代码实现、物理布局约束技巧以及温度补偿策略。文章还涵盖了标定方法、数据转换处理和系统验证方案,为激光测距、高能物理等需要精确时间测量的应用提供了实用解决方案。

weixin_28731223的博客 486

最大公共子序列 vs 最大公共子串

最大公共子序列及最大公共子串问题是动态规划算法中比较经典,而且经常在一起提到。其主要的不同点就是公共子序列不要求元素的下标值连续,而公共字串则要求下标连续。      动态规划算法重点是要发现题目的最优解的结构特征,尽可能用一个递归的方程式进行描述从而实现自底向上计算最优值。一般这里的最优值还不是动态规划题目的最终解,最优值所构建的是动态规划问题的解空间,我们需要根据这个解空间来最终构造出最优解

TechNerd的专栏 1459

2025年12月GESP真题及题解(C++一级): 小杨的爱心快递

2025年12月GESP真题及题解(C++一级): 小杨的爱心快递

王老师青少年编程 1648

【网络安全】SSRF漏洞讲解

SSRF漏洞讲解一、初识SSRF漏洞1.定义2.产生原理3.会导致的危害4.常见产生SSRF的地方5.常见缺失函数二、SSRF漏洞利用1.函数(1) file_get_contents(2)fsockopen()(3) curl_exec()2.协议(1)file协议(2)http协议(3)dict协议(4)gopher协议三、绕过1.绕过方式(1)检查IP是否为内网IP(2)Host获取与DNS绕过(3)通过各种协议(4)利用URL解析器滥用问题四、修复修复方案五、小结 一、初识SSRF漏洞 1.定义

你在看屏幕的同时,屏幕也在注视着你 3181

最大公共子序列c++

最大公共子序列c++

qq_37755459的博客 808

CAN轴控制流【6041,6040】

【代码】CAN轴控制流【6041,6040】

cfqq1989的博客 1783

最大公共子序列和最大公共子串

最大公共子序列和最大公共子串最大公共子序列最大公共子串 最大公共子序列 int MatchTopic::LongestCommonSequence(const std::string &topic, const std::string &test) { int lengthOfTopic = topic.size(); int lengthOfTest = test.size();...

fansimida的博客 208

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

buct oj 最大公共子序列问题

问题 B 最大公共子序列问题 时间限制: 1 Sec  内存限制: 128 MB [提交] 题目描述 对序列X=(x1, x2, .., xm),定义其子序列为(xi1, xi2, .., xik),i11, x2, .., xm),Y=(y1, y2, .., yn)的最长公共子序列的长度。 输入 输入为若干行,每行是一个计算题目,每行包括两个长度不超过1

nankeyimeng的博客 1497

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

动态规划——最大公共子序列

动态规划——最大公共子序列 动态规划,即为自顶向下分析,自底向上设计,此题按照如下设计方式: (设序列分别为X={x1,x2,…,xm },Y={y1,y2,…,yn}) ① 当Xm = Yn时,找出Xm-1和Yn-1的最长公共子序列,再加上Xm(即Yn) ② 当Xm ≠ Yn时,找出Xm-1和Yn的一个最长公共子序列,以及找出Xm和Yn-1的一个最长公共子序列,这两个公共子序列中较长者即为X和Y的最长公共子序列 我们可以用c[i][j]来记录Xi和Yj的最长公共子序列的长度,注意边界条件。 动态转移方程如

m0_45306991的博客 697

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java最大公共子序列

1,求2个数组最大公共子序列 2,求2个数组最大连续公共子序列 采用动态规划思想,因为子问题重合了。 先看问题2,外循环从a数组开始,使用数组c存储中间值。对于数组a的前i个元素组成的子数组,和数组b的前j个元素组成的子数组,设它们的最大连续子数组为c[i][j],若a的第i个元素等于b的第j个元素,则c[i][j]=c[i-1][j-1]+1,每次再与前一次保存的最大值比较即可。 问题1...

miss_fang 883

求最大公共子序列的长度

求两个字符串的最大公共序列的长度,比较简单的思想就是利用动态规划的思想来实现。先直接贴代码://求两个字符串的最大公共子序列 int getMaxLength(string str1,string str2){ int len1 = str1.length(); int len2 = str2.length(); int dp[101][101]; for(int

Reoger的博客 904

求最大公共子序列问题

问题描述: 给定两个字符串s1和s2;输出它们的最大公共子序列。 子序列和子数组不同,子数组是连续的;而子序列不要求是连续的,只要前后顺序关系一致就行。 例如: 输入: AB34C A1BC2 输出: ABC 输入: 3563243 513141 输出: 534 解法一: 用递归的解法,遍历其中一个字符串,对其中的每一个字母在另一个字符串中找相同。找到后把剩余的字符串进行下一轮的递归。即在双层循环...

覃会程的博客 1390

【模版】两字符串最大公共子序列

【模版】两字符串最大公共子序列 核心思想 dp精髓尽在图中,自行参悟(逃…) 代码 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define MaxSize 100010 //注意依题修改数组大小 using namespace st...

恒治学 185

最大公共子序列问题

2. 最大公共子序列 1.连续的情况下 题目:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度,要求重复子数组连续。 #include <iostream> #include <algorithm> using namespace std; int a[1005]; int b[1005]; int dp[1005][1005]; //dp[i][j],a数组的前i个元素与b数组的前j个元素的最大公共子序列 int main() { in..

qq12323qweeqwe的博客 326

最大公共子序列LCS

实用意义 面对经典算法,经常有同志质疑:为什么要研究这个问题,是不是吃得太饱? 这里说一下最大公共子序列问题的实际意义: 两个场景: 某个上万人参加的在线OJ考试,为了避免抄袭,需要用机器断定出任意两个提交的相似度。我们假设作弊者没有充分的时间和能力,只能多次对原稿进行如下两个操作之一:a添加一行,b删除一行。 两段基因序列,可能同源,在复制过程中,可能会丢失了某些位置的碱基对,也可能会把某些碱基对复制错。我们想知道两个序列同源的可能性多大。 示例 我们以字符串代表序列,不影响问题的本质。 那么,最大公

可雷曼土的日志 642

python实现最大公共子序列算法

研究目的 最近在做日志文本挖掘,我们要实现的功能之一是对日志事件进行聚类,聚类的方法是每两条日志之间,寻找他们的最大公共子短语(专业术语叫做最大公共子序列)。当公共子序列的长度超过一定时,我们认为这两条日志是相同事件的可能性比较大。所以本文是想实现寻找两条日志文本之间的最大公共子短语算法。 算法设计 最长公共子序列(LCS)是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们...

hxcaifly的博客 591

总结---最大公共子序列

#include #include #include using namespace std; int F[1001][1001]; int max(int a,int b) { return a>b?a:b; } int main() { string x,y; int i,j; int l1,l2; while(cin>>x>>y) { l1=x.size(); l2=y.

C_Ychen的专栏 915
上一篇: 背包问题(DP、回溯)
下一篇: 凸多边形最优三角剖分
laohan_
博客等级 码龄15年 112粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值