hdu 1503 LCS输出路径【dp】
不知道最后怎么输出,因为公共部分只输出一次。有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走。我用1表示向上走,2向左上方走,3向左走。
刚开始输入字符串时有两种方法,直接输入;或从地址后一位输入,即此时数组起始编号为1。直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS。两者在路径输出时有些差别,以前感觉直接输出LCS长度后者方便,其实都一样。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = ;
char s1[MAXN], s2[MAXN];
int dp[MAXN][MAXN], flag[MAXN][MAXN];
int len1, len2; void LCS()
{
memset(dp, , sizeof(dp));
for (int i = ; i <= len1; i++) flag[i][] = ;
for (int i = ; i <= len2; i++) flag[][i] = ;
for (int i = ; i <= len1; i++) {
for (int j = ; j <= len2; j++) {
if (s1[i - ] == s2[j - ]) {
dp[i][j] = dp[i - ][j - ] + ;
flag[i][j] = ;
}
else if (dp[i - ][j] >= dp[i][j - ]) {
dp[i][j] = dp[i - ][j];
flag[i][j] = ;
}
else {
dp[i][j] = dp[i][j - ], flag[i][j] = ;
}
}
}
} void Print(int x, int y)
{
if (x == && y == ) return;
if (flag[x][y] == ) {
Print(x - , y - );
cout << s1[x-];
}
else if (flag[x][y] == ) {
Print(x - , y);
cout << s1[x - ];
}
else {
Print(x, y - );
cout << s2[y - ];
}
} int main()
{
while (cin>>s1>>s2)
{
len1 = strlen(s1), len2 = strlen(s2);
LCS();
Print(len1, len2);
cout << endl;
}
return ;
}
起始编号为1:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN = ;
int dp[MAXN][MAXN], flag[MAXN][MAXN];
char s1[MAXN], s2[MAXN];
int len1, len2; void LCS()
{
for (int i = ; i <= len1; i++) flag[i][] = ;
for(int i = ; i <= len2; i++) flag[][i] = ;
for (int i = ; i <= len1; i++) {
for (int j = ; j <= len2; j++) {
if (s1[i] == s2[j])
dp[i][j] = dp[i - ][j - ] + , flag[i][j] = ;
else if (dp[i - ][j] >= dp[i][j - ])
dp[i][j] = dp[i - ][j], flag[i][j] = ;
else dp[i][j] = dp[i][j - ], flag[i][j] = ;
}
}
} void Print(int x, int y)
{
if (x == && y == ) return;
if (flag[x][y] == ) {
Print(x - , y - );
printf("%c", s1[x]);
}
else if (flag[x][y] == ) {
Print(x - , y);
printf("%c", s1[x]);
}
else {
Print(x, y - );
printf("%c", s2[y]);
}
return;
} int main()
{
while (scanf("%s %s", s1 + , s2 + )==)
{
len1 = strlen(s1 + ), len2 = strlen(s2 + );
memset(dp, , sizeof(dp));
LCS();
Print(len1, len2);
printf("\n");
}
return ;
}
hdu 1503 LCS输出路径【dp】的更多相关文章
- Educational DP Contest F - LCS (LCS输出路径)
题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...
- hdu 1026(BFS+输出路径) 我要和怪兽决斗
http://acm.hdu.edu.cn/showproblem.php?pid=1026 模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时 ...
- hdu 1385 Floyd 输出路径
Floyd 输出路径 Sample Input50 3 22 -1 43 0 5 -1 -122 5 0 9 20-1 -1 9 0 44 -1 20 4 05 17 8 3 1 //收费1 3 // ...
- hdu 1503 Advanced Fruits(LCS输出路径)
Problem Description The company "21st Century Fruits" has specialized in creating new sort ...
- HDU 1503 带回朔路径的最长公共子串
http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...
- Advanced Fruits(HDU 1503 LCS变形)
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 1503 Advanced Fruits(DP)
题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[ ...
- hdu 1503, LCS variants, find a LCS, not just the length, backtrack to find LCS, no extra markup 分类: hdoj 2015-07-18 16:24 139人阅读 评论(0) 收藏
a typical variant of LCS algo. the key point here is, the dp[][] array contains enough message to de ...
- HDU 1503【LCS】(字符串合并输出)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 题目大意: 给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符 ...
随机推荐
- html 输入框显示“小叉叉”的清空方法
在IE10以下,我们的输入框input会出现小叉叉.怎么解决这个问题呢? 针对input框我们做一个处理 <style type="text/css"> input:: ...
- 宝塔https
登录宝塔论坛,然后申请免费的https,然后在域名控制面板添加解析并验证,最后宝塔强制https跳转
- Java IO : NIO与IO的区别
参考资料:https://dzone.com/articles/java-nio-vs-io NIO是面向流的,IO是面向缓冲流的. NIO是非线程阻塞的,IO是线程阻塞的. NIO的Selector ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest[转]
命令模式可以很轻松的实现撤销(Undo)功能. 命令的接受者: 1unit uReceiveObject; 2 3interface 4 5type 6 TLight = class(T ...
- div style标签内嵌CSS样式
我们在DIV标签内.SPAN标签内.p标签等html标签内使用style属性直接设置div的样式. 一.在<div>标签内使用style设置css样式 - TOP 1.实例html ...
- Python基础-列表、元组、字典、字符串
Python基础-列表.元组.字典.字符串 多维数组 nums1 = [1,2,3] #一维数组 nums2 = [1,2,3,[4,56]] #二维数组 nums3 = [1,2,3,4,['a ...
- codevs1214 线段覆盖
1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0<N<100)条线段, ...
- Leetcode34.Find First and Last Position of Element in Sorted Array在排序数组中查找元素的位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- Javascript实现信息滚动效果的方法
<html><head><meta http-equiv="Content-Type" content="text/html; charse ...
- Sublime Text2的常用技巧总结(更新中...)
1. 选中一段内容后,按 Tab 或者 shift Tab 可以控制缩进 2. alt + shift + 数字, 开启多个窗口,数字代表分割后的个数,分割后按 Ctrl + shift + 数字 可 ...