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. LUOGU P4149 [IOI2011]Race

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KKK ,且边的数量最小. 输入输出格式 输入格式: 第一行:两个整数 n,kn,kn,k . 第二至 nnn 行:每行三个整数,表示一条无 ...

  2. json字符串和对象的相互转换

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式. 同时,JSON是 JavaScript 原生格式,这 ...

  3. 给没有id主键的表添加id,并设置为not null 然后填充自增id

    买的ip数据库,表上不带id 使用hibernate比较麻烦,所以直接改表 增加一个字段id,类型int ALTER TABLE t_ip ADD id int; 设置id不为空设置为主键,自增 AL ...

  4. Python学习(一) 安装,环境搭建,IDE

    第一篇废话太多了,我的博客最主要的是给自己看的,大家觉得还凑合也可以看看,能说自己想法的就更好了,因为一个人的思想是有局限性的.集思广益,自己的认知才不会被禁锢. 注:其他的系统没装,在Windows ...

  5. spring boot定时任务解析

    在SpringBoot中定时任务一般使用的是@Scheduled注解. @Scheduled 1.注解内容: @Target({ElementType.METHOD, ElementType.ANNO ...

  6. php的FTP操作类

    class_ftp.php <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状 ...

  7. Leetcode661.Image Smoother图片平滑器

    包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多 ...

  8. php pdo操作数据库的方法

    PDO 安装 你可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展. 1.在 Unix /linux系统上安装 PDO 在Unix上或Linux上你需要添加以下扩展: exten ...

  9. Faster RCNN算法demo代码解析

    一. Faster-RCNN代码解释 先看看代码结构: Data: This directory holds (after you download them): Caffe models pre-t ...

  10. python学习笔记10--协程、IO、IO多路复用

    本节内容 一.协程 1.1.协程概念 1.2.greenlet 1.3.Gevent 1.4.协程之爬虫 1.5.协程之socket 二.论事件驱动与异步IO 三.IO 3.1.概念说明 3.2.IO ...