他们都是用dp做;复杂度都是O(N方)

有一个大佬的博客写的很详细,是关于最长公共子序列的:https://blog.csdn.net/hrn1216/article/details/51534607#comments;

我觉得一开始处理这种问题比较棘手,无从下手,而dp一般有两种状态转移的思考方式,一种是正着,一种是倒着,而且dp一般记录的信息都是按照一定顺序,以什么结尾的答案,或者以什么开头的答案具有的一种性质,然后我们按顺序增加或减少开头或者结尾,形成一种状态的传递关系,还有一些状态的传递可能是像dfs中有某一状态走到一部走到另一状态,还是按顺序,由小规模到大规模;假设两个字符串长度为len1,和len2,那么我们要知道他们的公共子序列,就要知道小一些规模的同一个问题,这里我们通过缩短长度来缩小规模;

这里可以分两种情况,s1[len1]=s2[len2],那么它的答案dp[len1][len2]=dp[len1-1][len2-1]+1;

如果s1[len1]!=s2[len2], s1[len1],s2[jlen2],最多有一个是有效信息存在答案里面和另一个窜前面的元素配对,所以 dp[len1][len2]=max(dp[len1-1][len2],dp[len1][len2-1]);这样就缩小了规模,我们按照这种方法推广出去;

我们dp[i][j]代表s1 窜前i个字母和s2窜 前 j 个字母最长公共子序列,如果s1[i]=s2[j] ,dp[i][j]=d[i-1][j-1]+1,如果s1[i]!=s2[j], s1[i],s2[j],最多有一个是有效信息就是可能存在答案里面,和前面的配对,所以 dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

大致代码如下:(记得初始化)

 #include<iostream>
using namespace std;
char a1[],a2[],dp[][]={};
int main()
{
int n1,n2;
cin>>n1>>n2;
for(int i=;i<=n1;i++)
cin>>a1[i];
for(int j=;j<=n2;j++)
cin>>a2[j];
for(int i=;i<=n1;i++)
for(int j=;j<=n2;j++)
if(a1[i]==a2[j])
dp[i][j]=dp[i-][j-]+;
else
dp[i][j]=max(dp[i-][j],dp[i][j-]);
cout<<dp[n1][n2];
}

最长公共子窜和最长公共子序列(LCS)的更多相关文章

  1. 【51NOD】1006 最长公共子序列Lcs(动态规划)

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...

  2. 使用后缀数组寻找最长公共子字符串JavaScript版

    后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标 ...

  3. uva 10066 The Twin Towers (最长公共子)

    uva 10066 The Twin Towers 标题效果:最长公共子. 解题思路:最长公共子. #include<stdio.h> #include<string.h> # ...

  4. 最长回文子窜O(N)

    字符窜同构的性质:同构字符窜拥有最小和最大的表示方法: 最长回文子窜: 1.首先暴力法:(n三方) 枚举每个起点和终点,然后单向扫描判断是不是回文子窜: 2.中心扩散法,(N方) 枚举每个中点,向外扩 ...

  5. POJ 3356 AGTC(最长公共子)

    AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform  ...

  6. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  7. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  8. 最长公共子序列LCS(POJ1458)

    转载自:https://www.cnblogs.com/huashanqingzhu/p/7423745.html 题目链接:http://poj.org/problem?id=1458 题目大意:给 ...

  9. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

随机推荐

  1. MySQL数据备份与恢复(二) -- xtrabackup工具

    上一篇介绍了逻辑备份工具mysqldump,本文将通过应用更为普遍的物理备份工具xtrabackup来演示数据备份及恢复的第二篇内容. 1.  xtrabackup 工具的安装 1.1  安装依赖包 ...

  2. 6个出色的Kubernetes发行版,哪款最适合你?

    作者简介 Christopher Tozzi,自2008年来以自由职业者的身份对Linux.虚拟化.容器.数据存储及其相关主题进行报道. 本文来自Rancher Labs 时至今日,通过Kuberne ...

  3. mysql存储过程简单用法

    show procedure status 查看所有存储过程 <!--  简单存储过程  --> 先将结束符改成// delimiter // create procedure query ...

  4. 题解 P4344 【[SHOI2015]脑洞治疗仪】

    前言 这道题目呢,看上去很难,实际上我们可以用线段树解决这道题目. 正文 我们维护 sum.len.tag.lmax.rmax.ans. sum 就是这段区间非脑洞的个数 len 就是这段区间的长度 ...

  5. 干货 | 近期热点机器学习git项目

    No1:PyTorchImplementation of DeepMind's BigGAN(https://github.com/huggingface/pytorch-pretrained-Big ...

  6. ATM 最初版

    # 二 一个项目开发前,有一份开发文档 # # 项目: 编写小说阅读程序实现下属功能 # # # 一:程序运行开始时显示 # 0 账号注册 # 1 账号登录 # 2 充值功能 # 3 阅读小说 imp ...

  7. java新时间类

    时间 java8以前使用的时间很多方法都已经废弃了,而且不是线程安全的,java8提供了一系列的时间类,这些时间类都是线程安全的 LocalDate.LocalTime.LocalDateTime 这 ...

  8. Ribbon负载均衡实现

    1,在之前的博文中,我通过eureka,consul,zookeeper 实现了注册中心,在实现的服务发现过程中,都是通过RstTemplate 来实现RPC 远程调用 RestTemplate 封装 ...

  9. 9.Metasploit制作木马后门

    01木马与后门   木马?后门? 木马和后门都有害,尤其是木马,它由攻击者主动发起,稍不留心就会被利用:后门原来是留给自己方便用的,但也有可能被非法利用,这两种程序都会给用户带来损失. 木马是指潜伏在 ...

  10. cxk不会二进制 (贪心)

    cxk不会二进制 Description 最近cxk迷上了二进制,他很菜,有道简单的题不会做,挂在这里求大佬做一下: 以二进制形式给出两个数字:x,y.令s = x + y * 2 ^ k.输出能使 ...