题意:先给两个水果的名字然后得出一个最短的序列包含这两个词。

思路:我一开始的思路是先求出最长公共子序列,然后做一些处理将其他的部分输出来:两种水果的字符串和最长公共子序列的字符串这三个字符串做对比,当他们三个相同的时候将最长公共子序列里面的字符去掉,如果不相同,将水果中的字符串中的字符去掉直到相同为止,不过网上用了一个好像比较方便的方法,在输出最长公共子序列的路径时候也能输出其他的字符(利用递归回溯)。

注意:网上有一个求最长公共子序列的过程的二维的图值得一看,方便理解!!

我的方法:

//最长公共子序列记录路径
#include<stdio.h>
#include<string.h>
char a[110],b[110],e[110];
int book[110][110],c[110][110],s=0,b1[110],b2[110];
void dfs(int i,int j)
{
if(c[i][j]==1)//公共部分
{
dfs(i-1,j-1);
e[s++]=a[i-1];
}
else if(c[i][j]==2)//左
{
dfs(i,j-1);
}
else if(c[i][j]==3)//上
{
dfs(i-1,j);
}
}
int main()
{
while(~scanf("%s%s",a,b))
{
s=0;
memset(e,'\0',sizeof(e));
memset(book,0,sizeof(book));
memset(c,0,sizeof(c));
int i,j,k,w;
for(i=0; a[i]!='\0'; i++)
{
for(j=0; b[j]!='\0'; j++)
{
if(a[i]==b[j])//左上
{
i=i+1;
j=j+1;
book[i][j]=book[i-1][j-1]+1;
c[i][j]=1;
i=i-1;
j=j-1;
}
else if(book[i+1][j]>book[i][j+1])//左
{
i=i+1;
j=j+1;
book[i][j]=book[i][j-1];
c[i][j]=2;
i=i-1;
j=j-1;
}
else
{
i=i+1;
j=j+1;
book[i][j]=book[i-1][j];//上
c[i][j]=3;
i=i-1;
j=j-1;
}
}
}
dfs(i,j);
e[s]='\0';
char x[220];
w=0,k=0;
memset(x,'\0',sizeof(x));
for(int i=0; i<s; i++)
{
if(e[i]==a[w]&&e[i]==b[k])
{
printf("%c",e[i]);
w++,k++;
}
else
{
while(a[w]!=e[i]&&a[w]!='\0')
{
printf("%c",a[w++]);
}
while(e[i]!=b[k]&&b[k]!='\0')
{
printf("%c",b[k++]);
}
if(e[i]==a[w]&&e[i]==b[k])
{
printf("%c",e[i]);
w++,k++;
}
}
}
for(; a[w]!='\0'; w++)
printf("%c",a[w]);
for(; b[k]!='\0'; k++)
printf("%c",b[k]);
printf("\n");
}
return 0;
}

HDU - 1503 最长公共子序列记录路径的更多相关文章

  1. F - LCS 题解(最长公共子序列记录路径)

    题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...

  2. hdu 1503 最长公共子序列

    /* 给两个串a,b.输出一个最短的串(含等于a的子序列且含等于b的子序列) */ #include <iostream> #include <cstdio> #include ...

  3. HDU 1159 最长公共子序列(n*m)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. HDU 1159 最长公共子序列

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  5. 【最长上升子序列记录路径(n^2)】HDU 1160 FatMouse's Speed

    https://vjudge.net/contest/68966#problem/J [Accepted] #include<iostream> #include<cstdio> ...

  6. HDU 1503 Advanced Fruits(LCS+记录路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意: 给出两个串,现在要确定一个尽量短的串,使得该串的子串包含了题目所给的两个串. 思路: 这道题目就是 ...

  7. hdu 4681 最长公共子序列+枚举

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 #include<cstdio> #include<cstring> # ...

  8. 51nod 最长公共子序列+输出路径

    当x = 0 或 y = 0时 f[x][y] = 0 当a[x] = b[y]时  f[x][y] = f[x-1][y-1]+1 当a[x] != b[y]时 f[x][y] = max(f[x] ...

  9. 动态规划——最长公共子序列LCS及模板

    摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...

随机推荐

  1. 有了这个开源 Java 项目,开发出炫酷的小游戏好像不难?

    本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 的游戏. 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一 ...

  2. 使用纯粹的JS构建 Web Component

    原文链接:https://ayushgp.github.io/htm...译者:阿里云 - 也树 Web Component 出现有一阵子了. Google 费了很大力气去推动它更广泛的应用,但是除 ...

  3. 从解决Cocos2dx-2.x arm64 Crash 来看C的奇技淫巧

    最近把以前做的老游戏拿出来,重新编到手机上来玩玩,然后就有了以下的经历. 那时的引擎还是Cocos2dx-2.x,iPhone5还是高档机型.现在的机器是这样的,iPhone6S Plus我自用,今年 ...

  4. Windows下安装虚拟机

    一.准备工作 1.下载centos7操作系统 阿里巴巴站点: http://mirrors.aliyun.com/centos/7/isos/x86_64/ 2.下载VMware虚假机 可以直接通过3 ...

  5. 01 ORM框架概述

    ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ...

  6. c++中比较好用的黑科技

    切入正题,上黑科技 一.黑科技函数(常用的我就不写了,例如sort函数) 1.next_permutation(a+1,a+1+n) a[1-n]全排列 2.reverse(a+1,a+1+n) 将a ...

  7. 如何从普通程序员晋升为架构师 面向过程编程OP和面向编程OO

    引言 计算机科学是一门应用科学,它的知识体系是典型的倒三角结构,所用的基础知识并不多,只是随着应用领域和方向的不同,产生了很多的分支,所以说编程并不是一件很困难的事情,一个高中生经过特定的训练就可以做 ...

  8. Linux下MongoDB单实例的安装和配置详解

    推荐网站 MongoDB官网:http://www.mongodb.org/ MongoDB学习网站:http://www.runoob.com/mongodb 一.创建MongoDB的资源目录和安装 ...

  9. ggplot2(7) 定位

    7.1 简介 位置调整:调整每个图层中出现重叠的对象的位置,对条形图和其他有组距的图形非常有用: 位置标度:控制数据到图形中位置的映射,常用的是对数变换: 分面:先将数据集划分为多个子集,然后将每个子 ...

  10. Pocket+Evernote 打造个人知识库体系

    俗话说巧妇难为无米之炊,还是那个不太恰当的例子. 写作就好比人类的消化系统,想要持续的输出...那么就要持续的输入... 今天就来说一说如何进行持续有效的输入. 信息处理过程 先放一张图,这是我的整个 ...