博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ2432 Greatest Common Increasing Subsequence 题解报告
阅读量:7166 次
发布时间:2019-06-29

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

【题目大意】

给定两个序列,求其最长不下降公共子序列

【思路分析】

就是一道裸的模板题?(我居然忘了模板怎么打了QAQ……)

$f[i][j]$表示匹配到$a_i$和$b_j$的最长不下降公共子序列长度,分两种情况:

1.$a_i>b_j$:这种情况不需要转移,但是要记录一下长度,以便后面转移的时候找最大值

2.$a_i=b_j$:这就是配对成功的情况,那么从前面记录的最大值+1转移过来,并且要记录一下取到最大值的位置。

然后因为最后要输出这个公共子序列,所以中间要存一下。

【代码实现】

1 #include
2 #include
3 #include
4 #define go(i,a,b) for(register int i=a;i<=b;i++) 5 #define back(i,a,b) for(register int i=a;i>=b;i--) 6 using namespace std; 7 const int M=503; 8 int n,l1,l2,len; 9 int a[M],b[M];10 int f[M][M],pre[M][M];11 int main(){12 scanf("%d",&n);13 while(n--){14 memset(f,0,sizeof(f));memset(pre,-1,sizeof(pre));15 scanf("%d",&l1);16 go(i,1,l1) scanf("%d",&a[i]);17 scanf("%d",&l2);18 go(i,1,l2) scanf("%d",&b[i]);19 go(i,1,l1){20 int t=0,k=0;21 go(j,1,l2){22 f[i][j]=f[i-1][j];23 if(a[i]>b[j]&&t
f[i][j]) f[i][j]=t+1,pre[i][j]=k;25 }26 }27 int t=1;28 go(i,1,l2) if(f[l1][i]>f[l1][t]) t=i;//找到最长公共子序列29 printf("%d\n",f[l1][t]);30 if(!f[l1][t]) continue;31 vector
ans;32 back(i,l1,1)33 if(pre[i][t]!=-1) ans.push_back(a[i]),t=pre[i][t];//记录答案34 printf("%d",ans[ans.size()-1]);35 back(i,ans.size()-2,0) printf(" %d",ans[i]);36 puts("");37 }38 return 0;39 }
代码戳这里

 

转载于:https://www.cnblogs.com/THWZF/p/10885019.html

你可能感兴趣的文章
jQuery学习笔记(DOM操作)
查看>>
intest
查看>>
C语言 数组 行优先 实现
查看>>
ORACLE 监听日志文件太大停止写监听日志引起数据库连接不上问题
查看>>
springMVC零配置吐槽
查看>>
程序员必须知道的10大基础实用算法及其讲解
查看>>
petshop4.0 具体解释之中的一个(系统架构设计)
查看>>
centos 安装http协议的git server
查看>>
设置 zend studio 默认编码为UTF8
查看>>
并行编程之多线程共享非volatile变量,会不会可能导致线程while死循环
查看>>
asp.net MVC3 + JQuery 的ajax简单使用
查看>>
第 1 章 策略模式【Strategy Pattern】
查看>>
eclipse 在Servers窗口创建一个Tomcat 6.0 Server失败
查看>>
DJANTO之FORM
查看>>
设计模式 - 观察者模式(Observer Pattern) 详细解释
查看>>
C语言-Makefile经典教程(掌握这些足够)
查看>>
ASP.NET技巧:教你制做Web实时进度条
查看>>
转载:【Linux+windows】PHP5.5安装PHPRedis扩展
查看>>
Xcode加入应用图标以及启动界面
查看>>
一文带你了解 Raft 一致性协议的关键点
查看>>