题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006

题意:中文题诶~

思路:最长公共子序列模板题~

我们用dp[i][j]表示到a串第i个字符, b串第j个字符的最大匹配字符数,那么状态转移方程为:

dp[i][j]=dp[i-1][j-1]+1      a[i]==b[j]

dp[i][j]=max(dp[i][j-1], dp[i-1][j])   a[i]!=b[j]

我们可以这样理解:dp[i][j]表示第a串前i个字符与b串前j个字符的最大匹配数,dp[i-1][j-1]表示a字符前i-1个字符与b串前j-1个字符的最大匹配数

如果a[i]=b[j],那么很明显dp[i][j]=dp[i-1][j-1]+1;

若a[i]!=b[j],我们假设a, b的最大匹配串为c,显然a[i], b[j]不能同时作为c的最后一个字符,那么最优匹配情况即为a[i]为c的最后一个字符或者b[j]为c的最后一个字符(这点不大好理解),即:

dp[i][j]=dp[i][j-1]    a[i]是c的最后一个字符即匹配的末尾字符

dp[i][j]=dp[i-1][j]    b[j]是c的最后一个字符即匹配的末尾字符 (其实当a[i], b[j]都不是c的最后一个字符时即a[i], b[j]都不匹配时dp[i][j]=dp[i-1][j-1])

又dp要取最大值 ,即dp[i][j]=max(dp[i][j-1], dp[i-1][j])

题目还要求要输出一个最优匹配串,这个我们用vis[][]数组在dp过程中记录一下路径就好啦~

代码1:非递归取出路径

 #include <bits/stdc++.h>
#define MAXN 1010
using namespace std; int jj=, vis[MAXN][MAXN];
char gg[MAXN], a[MAXN], b[MAXN]; void getlcs(int i, int j){ //**逆推取出vis中保存的路径
while(i>&&j>){
if(vis[i][j]==){
gg[jj++]=a[i-]; //**将路径存储在gg数组中
i--;
j--;
}else if(vis[i][j]==){
j--;
}else if(vis[i][j]==){
i--;
}
}
gg[jj]='\0';
} int main(void){
int dp[MAXN][MAXN];
scanf("%s%s", a, b);
int lena=strlen(a);
int lenb=strlen(b);
memset(vis, , sizeof(vis));
memset(dp, , sizeof(dp));
for(int i=; i<=lena; i++){
for(int j=; j<=lenb; j++){
if(a[i-]==b[j-]){
dp[i][j]=dp[i-][j-]+;
vis[i][j]=; //**vis标记路径
}else if(dp[i][j-]>dp[i-][j]){
dp[i][j]=dp[i][j-];
vis[i][j]=;
}else{
dp[i][j]=dp[i-][j];
vis[i][j]=;
}
}
}
getlcs(lena, lenb);
for(int i=jj-; i>=; i--){ //**输出路径
printf("%c", gg[i]);
}
printf("\n");
return ;
}

代码2: 递归输出路径

 #include <bits/stdc++.h>
#define MAXN 1010
using namespace std; int jj=, vis[MAXN][MAXN];
char a[MAXN], b[MAXN]; void getlcs(int i, int j){ //**输出路径
if(!i||!j){
return;
}
if(vis[i][j]==){
getlcs(i-, j-);
printf("%c", a[i-]);
}else if(vis[i][j]==){
getlcs(i, j-);
}else{
getlcs(i-, j);
}
} int main(void){
int dp[MAXN][MAXN];
scanf("%s%s", a, b);
int lena=strlen(a);
int lenb=strlen(b);
memset(vis, , sizeof(vis));
memset(dp, , sizeof(dp));
for(int i=; i<=lena; i++){
for(int j=; j<=lenb; j++){
if(a[i-]==b[j-]){
dp[i][j]=dp[i-][j-]+;
vis[i][j]=; //**vis标记路径
}else if(dp[i][j-]>dp[i-][j]){
dp[i][j]=dp[i][j-];
vis[i][j]=;
}else{
dp[i][j]=dp[i-][j];
vis[i][j]=;
}
}
}
getlcs(lena, lenb);
printf("\n");
return ;
}

51nod1006(lcs)的更多相关文章

  1. 51Nod--1006 lcs

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

  2. 51nod--1006 最长公共子序列Lcs (动态规划)

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

  3. 51nod1006 -最长公共子序列Lcs【动态规划】

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

  4. 51Nod-1006 最长公共子序列Lcs

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

  5. 51Nod-1006【LCS】+【输出路径】模板题

    题目链接:https://vjudge.net/contest/225715#problem/B 转载于>>> 题目大意: 给出两个序列,要求输出它们的最长公共子序列. 解题思路: ...

  6. 最长公共子序列lcs 51nod1006

    推荐参考博客:动态规划基础篇之最长公共子序列问题 - CSDN博客  https://blog.csdn.net/lz161530245/article/details/76943991 个人觉得上面 ...

  7. 我的第一篇博客----LCS学习笔记

    LCS引论 在这篇博文中,博主要给大家讲一个算法----最长公共子序列(LCS)算法.我最初接触这个算法是在高中学信息学竞赛的时候.那时候花了好长时间理解这个算法.老师经常说,这种算法是母算法,即从这 ...

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

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

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

随机推荐

  1. .NET Core Preview

    .NET Core Preview 这是很容易上手使用.NET Core在您选择的平台上. 你只需要一个命令行,一个文本编辑器和10分钟的时间. 原文链接:https://www.microsoft. ...

  2. jQuery.extend()介绍

    },{name:"Jerry",sex:"Boy"}) 得到的Result结果是: result={name:"Jerry",age:21, ...

  3. Linux资源站

    1.<鸟哥的linux私房菜>中提供的台湾高速网络中心ftp站:http://ftp.twaren.net/Linux/CentOS/5/

  4. 用jQuery编的一个分页小代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. BZOJ2843——极地旅行社

    1.题目大意:动态树问题,点修改,链查询.另外说明双倍经验题=bzoj1180 2.分析:lct模板题,练手的 #include <stack> #include <cstdio&g ...

  6. 编码(Code)

    很遗憾,直接搜索Code或者编码是很难得找到这本书的,我也是无意中才接触到本书. 第一次读本书,对各方面的知识都不算很懂,觉得很多地方都写的太多浅显,好像本该就是这样子,一个编码系统说的那么麻烦干嘛, ...

  7. map的4种遍历方式

            System.out.println("key= "+ key + " and value= " + map.get(key));    }   ...

  8. tcp 三次握手

  9. 【云计算】marathon集群如何升级?

    Upgrading to a Newer Version We generally recommend creating a backup of the ZooKeeper state before ...

  10. Git索引

    原文: http://gitbook.liuhui998.com/7_4.html git中的索引(index)是一个存放了排好序的路径的二进制文件(通常是.git/index), 每一个条目都附带有 ...