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. input 输入框type='search'去掉×

    input输入时,为了让ios键盘的前进会变为搜索,设置input的type='search'但是安卓输入框后面会出现个小叉,实际不需要这个× 解决办法: input[type=search]::-w ...

  2. JS高级---学习roadmap---5 parts

    JS高级---学习roadmap---5 parts part 1-3 part 4-5

  3. Linux 下用Win共享

    让win能访问到 linux 的smb 共享: linux 安装 samba: apt-get install samba #然后 vim /etc/samba/smb.conf #找到securit ...

  4. python_数据类型_list

    names = ['one','two','three','four','five'] #列表切片 print(names[0:]) #['one', 'two', 'three', 'four', ...

  5. JAVA读取文件操作时路径的斜杠问题

    java中的路径一般用"/"windows中的路径用"\"linux,unix中的路径一般用"/"其中java中"/"等 ...

  6. round 469

    第一次打codeforces,还是太菜了 代码全部来自大神void_f C #include <cstdio> #include <vector> #include <c ...

  7. JAVA利用JXL导出/生成 EXCEL1

    /** * 导出导出采暖市场部收入.成本.利润明细表 * @author JIA-G-Y */ public String exporExcel(String str) { String str=Se ...

  8. 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...

  9. js实现放大镜特效的实现方法

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  10. ML面试1000题系列(1-20)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 1.简要介绍SVM 全称是support vec ...