51nod1006(lcs)
题目链接: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)的更多相关文章
- 51Nod--1006 lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51nod--1006 最长公共子序列Lcs (动态规划)
题目: 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...
- 51nod1006 -最长公共子序列Lcs【动态规划】
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
- 51Nod-1006 最长公共子序列Lcs
题目链接 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca ...
- 51Nod-1006【LCS】+【输出路径】模板题
题目链接:https://vjudge.net/contest/225715#problem/B 转载于>>> 题目大意: 给出两个序列,要求输出它们的最长公共子序列. 解题思路: ...
- 最长公共子序列lcs 51nod1006
推荐参考博客:动态规划基础篇之最长公共子序列问题 - CSDN博客 https://blog.csdn.net/lz161530245/article/details/76943991 个人觉得上面 ...
- 我的第一篇博客----LCS学习笔记
LCS引论 在这篇博文中,博主要给大家讲一个算法----最长公共子序列(LCS)算法.我最初接触这个算法是在高中学信息学竞赛的时候.那时候花了好长时间理解这个算法.老师经常说,这种算法是母算法,即从这 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
随机推荐
- .NET Core Preview
.NET Core Preview 这是很容易上手使用.NET Core在您选择的平台上. 你只需要一个命令行,一个文本编辑器和10分钟的时间. 原文链接:https://www.microsoft. ...
- jQuery.extend()介绍
},{name:"Jerry",sex:"Boy"}) 得到的Result结果是: result={name:"Jerry",age:21, ...
- Linux资源站
1.<鸟哥的linux私房菜>中提供的台湾高速网络中心ftp站:http://ftp.twaren.net/Linux/CentOS/5/
- 用jQuery编的一个分页小代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- BZOJ2843——极地旅行社
1.题目大意:动态树问题,点修改,链查询.另外说明双倍经验题=bzoj1180 2.分析:lct模板题,练手的 #include <stack> #include <cstdio&g ...
- 编码(Code)
很遗憾,直接搜索Code或者编码是很难得找到这本书的,我也是无意中才接触到本书. 第一次读本书,对各方面的知识都不算很懂,觉得很多地方都写的太多浅显,好像本该就是这样子,一个编码系统说的那么麻烦干嘛, ...
- map的4种遍历方式
System.out.println("key= "+ key + " and value= " + map.get(key)); } ...
- tcp 三次握手
- 【云计算】marathon集群如何升级?
Upgrading to a Newer Version We generally recommend creating a backup of the ZooKeeper state before ...
- Git索引
原文: http://gitbook.liuhui998.com/7_4.html git中的索引(index)是一个存放了排好序的路径的二进制文件(通常是.git/index), 每一个条目都附带有 ...