51Nod-1006【LCS】+【输出路径】模板题
题目链接: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】+【输出路径】模板题的更多相关文章
- LCS以及输出路径模板
记忆 两个for用来寻找LCS,DP是二维的,每一维代表了字符串的长度. 寻找的代码部分 if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][ ...
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
- hdu 1503 Advanced Fruits(LCS输出路径)
Problem Description The company "21st Century Fruits" has specialized in creating new sort ...
- hdu 1503 LCS输出路径【dp】
hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...
- 51nod 矩阵快速幂(模板题)
1113 矩阵快速幂 基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...
- Educational DP Contest F - LCS (LCS输出路径)
题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...
- poj 2007 凸包构造和极角排序输出(模板题)
Scrambled Polygon Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10841 Accepted: 508 ...
- Alice拜年 模板题 /// 最短路Dijk oj1344
题目大意: 大年初一,Alice带上拜年礼物去给N-1位亲朋好友长辈拜年,亲友真多啊,是个大家族.由于Alice才2岁,力气不大,每次只能拿一份礼物,拜完年之后,要回家取第二份礼物,然后去下一家拜年( ...
- PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径
模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...
随机推荐
- <转载>iTerm2使用技巧
原文链接:http://www.cnblogs.com/756623607-zhang/p/7071281.html 1.设置窗口 定位到 [Preferences - Profiles - Wi ...
- jquery 学习(三) - 遍历操作
HTML代码 <p>1111</p> <p>1111</p> <p>1111</p> <p>1111</p&g ...
- Java 线性表、栈、队列和优先队列
1.集合 2.迭代器 例子: 3.线性表 List接口继承自Collection接口,有两个具体的类ArrayList或者LinkedList来创建一个线性表 数组线性表ArrayList Linke ...
- 蒙特卡罗定位(Particle Filter Localization)笔记
善始善终,这篇文章是Coursera课程Robotics: Estimation and Learning最后一周的课程总结.里面的小哥讲得不是很清晰,留下的作业很花功夫(第二周课程也是酱紫). 这周 ...
- Python Tools for Machine Learning
Python Tools for Machine Learning Python is one of the best programming languages out there, with an ...
- saltStack运维工具的部署及master迁移实现的过程详解
服务器端:192.168.3.87 客户端:192.168.3.86.192.168.3.108 1.salt服务器端安装 192.168.3.87 rpm -Uvh http://mirrors.y ...
- 部署vCenter Server Appliance 6.7
=============================================== 2019/4/14_第1次修改 ccb_warlock == ...
- 破解idea
2019最新注册码 地址: http://idea.lanyus.com/ https://blog.csdn.net/best_luxi/article/details/81479820
- npm下载速度过慢的解决办法
第一种方式: 在cmd 输入指令:npm config set registry https://registry.npm.taobao.org 不建议使用cnpm! 设置完后,注意检查:输入指令:n ...
- 【转载】JavaScript中的属性:如何遍历属性
转载自:http://www.cnblogs.com/ziyunfei/archive/2012/11/03/2752905.html 在JavaScript中,遍历一个对象的属性往往没有在其他语言中 ...