博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【51NOD-0】1006 最长公共子序列Lcs
阅读量:6704 次
发布时间:2019-06-25

本文共 1484 字,大约阅读时间需要 4 分钟。

【算法】经典DP

【题解】,输出路径可以记录上一个有效节点就是有点麻烦。

因为开始时写法不太明确,打印结果时初始循环地方搞错了,后来修正写法时忘了改过来,调了好久。

#include
#include
#include
#define rep(i,j,k) for(int i=j;i<=k;i++)using namespace std;const int maxn=1010;int f[maxn][maxn],n,m;char a[maxn],b[maxn];struct cyc{
int a,b,c;}pre[maxn][maxn];int main(){ scanf("%s%s",a+1,b+1); n=strlen(a+1);m=strlen(b+1); memset(f,0,sizeof(f)); rep(i,1,n) { rep(j,1,m) { if(f[i-1][j]>f[i][j-1]) { f[i][j]=f[i-1][j]; if(pre[i-1][j].c)pre[i][j].a=i-1,pre[i][j].b=j;else pre[i][j]=pre[i-1][j]; pre[i][j].c=0; } else { f[i][j]=f[i][j-1]; if(pre[i][j-1].c)pre[i][j].a=i,pre[i][j].b=j-1;else pre[i][j]=pre[i][j-1]; pre[i][j].c=0; } if(a[i]==b[j]&&f[i-1][j-1]+1>f[i][j]) { f[i][j]=f[i-1][j-1]+1; if(pre[i-1][j-1].c)pre[i][j].a=i-1,pre[i][j].b=j-1;else pre[i][j]=pre[i-1][j-1]; pre[i][j].c=1; } } } int x=n,y=m; char ch[maxn];int tot=-1; while(x!=0||y!=0) {// printf("c=%d\n",pre[x][y].c); if(pre[x][y].c)ch[++tot]=a[x]; int xx=pre[x][y].a; y=pre[x][y].b; x=xx; } for(int i=tot;i>=0;i--)printf("%c",ch[i]); return 0;}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/6900568.html

你可能感兴趣的文章
MySQL线程池
查看>>
wifi测试相关(iwconfig,WPA Supplicant用法)
查看>>
一致性Hash算法
查看>>
ubuntu redis安装
查看>>
安装DZ 论坛记录
查看>>
ssh
查看>>
iOS面试题收集
查看>>
cmd常用命令
查看>>
HttpURLConnection getting locked
查看>>
Wireshark过滤器语法设置
查看>>
PHP使用zlib扩展实现页面GZIP压缩输出
查看>>
jquery的each()详细介绍
查看>>
oracle JOB 查询 添加 修改 删除 运行
查看>>
Struts2下载配置contentDisposition的含义
查看>>
如何安全的存储用户的密码【摘】
查看>>
eclipse在 Android Private Libraries中添加支持库
查看>>
BeanUtils MethodUtils PropertyUtils 的使用
查看>>
http接口测试—自动化测试框架设计
查看>>
Tomcat 热部署实现方式源码分析总结
查看>>
linux进程
查看>>