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中都出现过并且出现顺序与 ...
随机推荐
- CMake Error: your CXX compiler: "" was not found
[root@amax src]# cmake . -- The CXX compiler identification is unknown CMake Error at /usr/local/sha ...
- BZOJ1030——文本生成器
给你若干给字符串,再给你一个m,问长度是m的字符串中包含给定字符串的数量mod 10007是多少 这个拿过来啥思路也没有,后来还是看了题解,才知道,原来,原来....那个带fail的Trie还可以搞别 ...
- style="visibility: hidden" 和 style=“display:none”区别
大多数人很容易将CSS属性display和visibility混淆,它们看似没有什么不同,其实它们的差别却是很大的. visibility属性用来确定元素是显示还是隐藏的,这用visibility=& ...
- ACM - a + b Problem
前几天看了ACM的第一题,映入眼帘的是一个“简单”的题目: 输入两个数,a,b 输出他们的和. 本着,此乃ACM的原则,便有了如下的思考: ACM的题目肯定很难,a+b,怎么可能直接printf,不行 ...
- php构造函数和析构函数
构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用 ...
- python self introspection
http://www.ibm.com/developerworks/cn/linux/l-pyint/index1.html
- ios中json解析出现的null问题
http://my.oschina.net/iq19900204/blog/408034 在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式. 问题现象 但是几个 ...
- jquery验证手机号码和固定电话号码
<pre name="code" class="javascript"> //验证手机号码或者电话号码 function checkContactN ...
- 【Docker】docker /var/lib/docker/aufs/mnt 目录满了,全是垃圾数据,咋搞?
命令: #!/bin/bash # 推荐方式 docker volume ls -f dangling=true | awk '{ print $2 }' | xargs docker volume ...
- c#图片输出
1: Response.BinaryWrite() 其实就是和输出文字一样 只是图片是流的形式; delegate long myDel(int first, int second); FileSt ...