题目链接:https://vjudge.net/contest/225715#problem/B

转载于>>>

题目大意:

给出两个序列,要求输出它们的最长公共子序列。

解题思路:

最长公共子序列模板题~

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

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

dp[i][j]=max(dp[i][j-], dp[i-][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过程中记录一下路径就好啦~

非递归输出路径

#include <bits/stdc++.h>
using namespace std;
#define MAXN 1010
int dp[MAXN][MAXN];
int vis[MAXN][MAXN];
string stra, strb;
char output[MAXN]; int cur = ; void getlcs(int i, int j)
{
while (i>&&j>) //逆推取出vis中保存的路径
{
if (vis[i][j]==) {
output[cur++] = stra[i - ];
i--; j--;
}
else if (vis[i][j] == ) {
j--;
}
else {
i--;
}
}
} int main()
{
cin >> stra >> strb;
int lena = stra.length();
int lenb = strb.length();
for (int i = ; i <= lena; i++){
for (int j = ; j <= lenb; j++) {
if (stra[i - ] == strb[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 = cur - ; i >= ; i--) //逆向输出
printf("%c", output[i]);
cout << endl;
return ;
}

递归输出路径

#include <bits/stdc++.h>
using namespace std;
#define MAXN 1010
int dp[MAXN][MAXN];
int vis[MAXN][MAXN];
string stra, strb; void getlcs(int i, int j) { //**输出路径
if (!i || !j) { //因为i-1要>=0
return;
}
if (vis[i][j] == ) {
getlcs(i - , j - );
printf("%c", stra[i - ]);
}
else if (vis[i][j] == ) {
getlcs(i, j - );
}
else {
getlcs(i - , j);
}
} int main()
{
cin >> stra >> strb;
int lena = stra.length();
int lenb = strb.length();
for (int i = ; i <= lena; i++){
for (int j = ; j <= lenb; j++) {
if (stra[i - ] == strb[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);
cout << endl;
return ;
}

2018-05-18

51Nod-1006【LCS】+【输出路径】模板题的更多相关文章

  1. LCS以及输出路径模板

    记忆 两个for用来寻找LCS,DP是二维的,每一维代表了字符串的长度. 寻找的代码部分 if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][ ...

  2. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

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

  3. hdu 1503 Advanced Fruits(LCS输出路径)

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  4. hdu 1503 LCS输出路径【dp】

    hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...

  5. 51nod 矩阵快速幂(模板题)

    1113 矩阵快速幂  基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...

  6. Educational DP Contest F - LCS (LCS输出路径)

    题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...

  7. poj 2007 凸包构造和极角排序输出(模板题)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10841   Accepted: 508 ...

  8. Alice拜年 模板题 /// 最短路Dijk oj1344

    题目大意: 大年初一,Alice带上拜年礼物去给N-1位亲朋好友长辈拜年,亲友真多啊,是个大家族.由于Alice才2岁,力气不大,每次只能拿一份礼物,拜完年之后,要回家取第二份礼物,然后去下一家拜年( ...

  9. PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径

    模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...

随机推荐

  1. PhoneUtil

    package cn.fraudmetrix.octopus.horai.biz.utils; import org.springframework.util.StringUtils; import ...

  2. 使用CSS将图像对齐

    相对于<img>元素的align特性来说,越来越多的网页设计人员使用float属性来对齐图像.可以采用两种方式来实现对齐.为了确保文本不会与图像的边缘接触,我们经常会给图像增加一个外边距. ...

  3. DSO windowed optimization 代码 (1)

    这里不想解释怎么 marginalize,什么是 First-Estimates Jacobian (FEJ).这里只看看代码,看看Hessian矩阵是怎么构造出来的. 1 优化流程 整个优化过程,也 ...

  4. python 设计及调试的一些小技巧

    在“笨办法学习python”中介绍了一些设计函数以及调试技巧: 参考网址:http://www.jb51.net/shouce/Pythonbbf/latest/ex36.html If 语句的规则¶ ...

  5. CentOS 6.5下快速搭建ftp服务器[转]

    CentOS 6.5下快速搭建ftp服务器 1.用root 进入系统 2.使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了vsftp,使用这个命令会在屏幕上显示vs ...

  6. 【API】恶意样本分析手册——API函数篇

    学编程又有材料了 http://blog.nsfocus.net/malware-sample-analysis-api/

  7. C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)

    多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...

  8. spring mvc常用配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. opencv学习笔记(九)Mat 访问图像像素的值

    对图像的像素进行访问,可以实现空间增强,反色,大部分图像特效系列都是基于像素操作的.图像容器Mat是一个矩阵的形式,一般情况下是二维的.单通道灰度图一般存放的是<uchar>类型,其数据存 ...

  10. nginx异常处理

    1.nginx不转发消息头header问题 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_se ...