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 题目大意: 给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符 ...
随机推荐
- 跟我一起做一个vue的小项目(五)
接下来我们要做的是热门推荐页面,我们写一个推荐组件 使用的方法也是前端data中的数据渲染到页面上面,这里对文字过长取省略号的方法不成功使用了一个小技巧 使用了min-width:0 我们来看完整的代 ...
- laravel-admin列表排序在使用了$grid->model()->latest()后$grid其它加上sortable()可排序的列在排序时不起作用
laravel-admin这个基于laravel的后台框架,简单易用,$grid的默认排序是主键升序的排列方式,但在使用了`$grid->model()->latest();`自定义默认排 ...
- redis缓存使用详解
mysql数据库是存在磁盘中的,操作是对于磁盘操作,这样访问量和并发很大时,运行速率就取决于磁盘的容量,带宽的大小和读取的方式,也就是 sql 语句,次数和效率也会影响读取效率.当访问量和并发很大的时 ...
- iOS播放器横竖屏切换
http://www.cocoachina.com/cms/wap.php?action=article&id=20292 http://feihu.me/blog/2015/how-to-h ...
- Spring2.5依靠注入的方式有三种
Spring2.5依靠注入的方式有三种: 1.通过setter方法注入: 2.通过构造方法注入: 3.通过注解进行注入: 第一种方式:通过setter方法注入 Java代码 package com.t ...
- Leetcode63.Unique Paths II不同路径2
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...
- ue4 fstring 和std::string互转
https://forums.unrealengine.com/development-discussion/c-gameplay-programming/6517-convert-std-strin ...
- Serializable 可串行化接口
Serializable 可串行化接口 定义一个User类,实现Serializable接口: package com.monkey1025; import java.io.Serializable; ...
- 2019-8-31-dotnet-core-用值初始化整个数组
title author date CreateTime categories dotnet core 用值初始化整个数组 lindexi 2019-08-31 16:55:58 +0800 2019 ...
- react-native-login-redux
项目地址如下 https://github.com/agunbuhori/react-native-login-redux 先看页面 ```js // 还有中英文切换 //src/global.js ...