HDU - 1503 最长公共子序列记录路径
题意:先给两个水果的名字然后得出一个最短的序列包含这两个词。
思路:我一开始的思路是先求出最长公共子序列,然后做一些处理将其他的部分输出来:两种水果的字符串和最长公共子序列的字符串这三个字符串做对比,当他们三个相同的时候将最长公共子序列里面的字符去掉,如果不相同,将水果中的字符串中的字符去掉直到相同为止,不过网上用了一个好像比较方便的方法,在输出最长公共子序列的路径时候也能输出其他的字符(利用递归回溯)。
注意:网上有一个求最长公共子序列的过程的二维的图值得一看,方便理解!!
我的方法:
//最长公共子序列记录路径
#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 最长公共子序列记录路径的更多相关文章
- F - LCS 题解(最长公共子序列记录路径)
题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...
- hdu 1503 最长公共子序列
/* 给两个串a,b.输出一个最短的串(含等于a的子序列且含等于b的子序列) */ #include <iostream> #include <cstdio> #include ...
- HDU 1159 最长公共子序列(n*m)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 1159 最长公共子序列
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【最长上升子序列记录路径(n^2)】HDU 1160 FatMouse's Speed
https://vjudge.net/contest/68966#problem/J [Accepted] #include<iostream> #include<cstdio> ...
- HDU 1503 Advanced Fruits(LCS+记录路径)
http://acm.hdu.edu.cn/showproblem.php?pid=1503 题意: 给出两个串,现在要确定一个尽量短的串,使得该串的子串包含了题目所给的两个串. 思路: 这道题目就是 ...
- hdu 4681 最长公共子序列+枚举
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 #include<cstdio> #include<cstring> # ...
- 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] ...
- 动态规划——最长公共子序列LCS及模板
摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...
随机推荐
- python爬虫之字体反爬
一.什么是字体反爬? 字体反爬就是将关键性数据对应于其他Unicode编码,浏览器使用该页面自带的字体文件加载关键性数据,正常显示,而当我们将数据进行复制粘贴.爬取操作时,使用的还是标准的Unicod ...
- Java2变量和运算符
课后作业:[必做题] 1√AB互换 已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序.(知识点:变量和运算符综合应用) [必做题] package com.two; public clas ...
- ef01
1.ef简介 学习地址: https://www.entityframeworktutorial.net/ orm:Object relations mapping 对象关系映射 实体类中的属性与数据 ...
- 用table类型布局一个新闻网页
<html><head><meta http-equiv="Content-Type" content="text/html; charse ...
- fsLayuiPlugin联动表格使用(一)
简单联动表格使用 点击主表格,加载副表格数据, 演示地址:http://fslayuiplugin.fallsea.com/views/linkageDatagrid/index.html 联动表格配 ...
- 前端性能优化之 Composite
摘要: 一个 Web 页面的展示,简单来说可以认为经历了 JavaScript/Style/Layout/Paint/Composite 几个步骤.本文主要深入 Composite 部分,从渲染原理. ...
- localstorage浏览器储存
需求 a.html页面生成订单信息,b.html中调用. 通过不操作数据库,直接在浏览器自带的数据库中进行操作,当然主要是对Json数据的操作. a.html代码部分: <!--html--&g ...
- 前端面试题(HTML、CSS部分)
HTML.CSS部分: 一.html5有哪些新特性.移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 新特性: HTML5 现在已经不是 SGML 的 ...
- 必备技能echarts
echart 设置图例图标形状 https://blog.csdn.net/qq_15390381/article/details/81736796legend: { data: ["总数& ...
- React的路由react-router
意思是:当你写一个web应用时候,应噶install的是react-router-dom,同样的,当你想写一个Native应用时候,需要install的是react-router-native,这两个 ...