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中都出现过并且出现顺序与 ...
随机推荐
- 02快速学习ExtJs之---第一个HelloWord!
这篇主要讲部署下ExtJS开发环境,以及搭建项目.我们使用ExtJs官方提供的Sencha Cmd来搭建 1.搭建项目 1.下载官方的Sencha Cmd工具,安装. 2..Window用户进入到命令 ...
- webpack 教程 那些事儿01-webpack是什么
文章目录 1. 为什么引入webpack? 2. webpack到底是什么? 3. webpack的工作流程理念 4. webpack的使用 4.1. install webpack 5. 分享源码d ...
- Android应用中返回键的监听及处理
MainActivity: package com.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent ...
- BZOJ2631——tree
1.题目大意:bzoj1798的lct版本 2.分析:这个把线段树改成splay就好 #include <stack> #include <cstdio> #include & ...
- iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html
iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html 前言 這裡只是講一個故事,一個發生在我身上的真實的故事.曾經,我以為搞加 ...
- CSS3中动画属性transform、transition和animation
Transform:变形 在网页设计中,CSS被习惯性的理解为擅长表现静态样式,动态的元素必须借助于javascript才可以实现,而CSS3的出现改变了这一思维方式.CSS3除了增加革命性的创新功能 ...
- explicit,violate,volatile,mutable小结
转自:http://blog.csdn.net/helonsy/article/details/7091130 explicit:放在构造函数前面可以阻止构造函数的隐式类型转换.这样可以避免不必要的错 ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- U盘安装ubuntu server 14.04
U盘安装ubuntu server 14.04 U盘安装ubuntu server 14.04 1.制作启动u盘 2.开始安装 1 将u盘插入主机,重启后从u盘启动 2 选择语言(随便挑,随便选),我 ...
- hadoop学习过程中一系列问题
12---修改host .修改主机名5.1 修改当前会话的主机名sudo hostname SY-0217查看当前会话的主机名hostname默认是我装Linux 虚机时输入的名字Ubuntu5.2 ...