hdu 1503

  不知道最后怎么输出,因为公共部分只输出一次。有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走。我用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】的更多相关文章

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

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

  2. hdu 1026(BFS+输出路径) 我要和怪兽决斗

    http://acm.hdu.edu.cn/showproblem.php?pid=1026 模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时 ...

  3. 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 // ...

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

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

  5. HDU 1503 带回朔路径的最长公共子串

    http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...

  6. Advanced Fruits(HDU 1503 LCS变形)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. hdu 1503 Advanced Fruits(DP)

    题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[ ...

  8. 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 ...

  9. HDU 1503【LCS】(字符串合并输出)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 题目大意: 给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符 ...

随机推荐

  1. 跟我一起做一个vue的小项目(五)

    接下来我们要做的是热门推荐页面,我们写一个推荐组件 使用的方法也是前端data中的数据渲染到页面上面,这里对文字过长取省略号的方法不成功使用了一个小技巧 使用了min-width:0 我们来看完整的代 ...

  2. laravel-admin列表排序在使用了$grid->model()->latest()后$grid其它加上sortable()可排序的列在排序时不起作用

    laravel-admin这个基于laravel的后台框架,简单易用,$grid的默认排序是主键升序的排列方式,但在使用了`$grid->model()->latest();`自定义默认排 ...

  3. redis缓存使用详解

    mysql数据库是存在磁盘中的,操作是对于磁盘操作,这样访问量和并发很大时,运行速率就取决于磁盘的容量,带宽的大小和读取的方式,也就是 sql 语句,次数和效率也会影响读取效率.当访问量和并发很大的时 ...

  4. iOS播放器横竖屏切换

    http://www.cocoachina.com/cms/wap.php?action=article&id=20292 http://feihu.me/blog/2015/how-to-h ...

  5. Spring2.5依靠注入的方式有三种

    Spring2.5依靠注入的方式有三种: 1.通过setter方法注入: 2.通过构造方法注入: 3.通过注解进行注入: 第一种方式:通过setter方法注入 Java代码 package com.t ...

  6. Leetcode63.Unique Paths II不同路径2

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...

  7. ue4 fstring 和std::string互转

    https://forums.unrealengine.com/development-discussion/c-gameplay-programming/6517-convert-std-strin ...

  8. Serializable 可串行化接口

    Serializable 可串行化接口 定义一个User类,实现Serializable接口: package com.monkey1025; import java.io.Serializable; ...

  9. 2019-8-31-dotnet-core-用值初始化整个数组

    title author date CreateTime categories dotnet core 用值初始化整个数组 lindexi 2019-08-31 16:55:58 +0800 2019 ...

  10. react-native-login-redux

    项目地址如下 https://github.com/agunbuhori/react-native-login-redux 先看页面 ```js // 还有中英文切换 //src/global.js ...