
HDU - 1503 最长公共子序列记录路径
发布日期:2021-05-06 14:14:31
浏览次数:22
分类:精选文章
本文共 1747 字,大约阅读时间需要 5 分钟。
题意:先给两个水果的名字然后得出一个最短的序列包含这两个词。
思路:我一开始的思路是先求出最长公共子序列,然后做一些处理将其他的部分输出来:两种水果的字符串和最长公共子序列的字符串这三个字符串做对比,当他们三个相同的时候将最长公共子序列里面的字符去掉,如果不相同,将水果中的字符串中的字符去掉直到相同为止,不过网上用了一个好像比较方便的方法,在输出最长公共子序列的路径时候也能输出其他的字符(利用递归回溯)。
注意:网上有一个求最长公共子序列的过程的二维的图值得一看,方便理解!!
我的方法:
//最长公共子序列记录路径#include#include 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
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月09日 11时06分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Web应用程序并发问题处理的一点小经验
2019-03-06
entity framework core在独立类库下执行迁移操作
2019-03-06
Asp.Net Core 2.1+的视图缓存(响应缓存)
2019-03-06
RE套路 - 关于pyinstaller打包文件的复原
2019-03-06
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2019-03-06
Ef+T4模板实现代码快速生成器
2019-03-06
c++ static笔记
2019-03-06
C++中头文件相互包含与前置声明
2019-03-06
JQuery选择器
2019-03-06
SQL--存储过程
2019-03-06
多线程之volatile关键字
2019-03-06
2.1.4奇偶校验码
2019-03-06
2.2.2原码补码移码的作用
2019-03-06
Java面试题:Servlet是线程安全的吗?
2019-03-06
Java集合总结系列2:Collection接口
2019-03-06
Linux学习总结(九)—— CentOS常用软件安装:中文输入法、Chrome
2019-03-06
MySQL用户管理:添加用户、授权、删除用户
2019-03-06
比技术还重要的事
2019-03-06
linux线程调度策略
2019-03-06
软中断和实时性
2019-03-06