博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CH5101 LCIS
阅读量:7057 次
发布时间:2019-06-28

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

题意:

求两个长度不超过3000的序列的最长公共上升子序列

思路: 

 

  • 朴素解法:用f[i,j]表示a1~ai与b1~bj可以构成的以bj为结尾的LCIS的长度,三重循环求解:
for(res i=1 ; i<=n ; i++)    for(res j=1 ; j<=m ; j++)        if(a[i]==b[j])        {           for(res k=1 ; k

 

  • 经过观察可以发现:当外层的i固定时,条件b[k]<a[i]也是固定的,所以当j增加1时,k的取值范围也只增加了1,即只有j可能进入新的决策集合,则可以优化为两重循环:

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const int N=3010; 7 int a[N],b[N]; 8 int f[N][N]; 9 int n;10 11 int main()12 {13 scanf("%d",&n);14 for(int i=1 ; i<=n ; i++) scanf("%d",&a[i]);15 for(int i=1 ; i<=n ; i++) scanf("%d",&b[i]);16 17 for(int i=1 ; i<=n ; i++)18 {19 int val=0;//表示决策集合(即f[i-1][k]的最大值) 20 for(int j=1 ; j<=n ; j++)21 {22 if(a[i]==b[j]) f[i][j]=val+1;23 else f[i][j]=f[i-1][j];24 if(b[j]
View Code

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/wmq12138/p/10363982.html

你可能感兴趣的文章
Apache Hive2.1.0安装笔记
查看>>
django中翻译处理国际化方法
查看>>
三:JVM学习-内存分配以及回收策略
查看>>
spring redis 配置子域名共享session (有点坑)
查看>>
Linux 条件变量 pthread_cond_signal及pthread_cond_wait
查看>>
比AtomicInteger更高效的并发计数器LongAdder
查看>>
做一个座右铭工具每天激励自己
查看>>
Jenkins安装配置
查看>>
vmware12下对虚拟机ubuntu14.10系统所在分区sda1进行磁盘扩容
查看>>
EJB到底是什么,真的那么神秘吗??
查看>>
UI开发工具
查看>>
广义表 (五)
查看>>
Swift中NSTimer定时器的使用
查看>>
Forms开发中触发器的执行顺序
查看>>
SEO博客三个月没更新排行骤步康复
查看>>
JQuery 插件开发的入门介绍
查看>>
马哥2016全新Linux+Python高端运维班第五周作业
查看>>
联想扬天A4680R台式电脑增加内存不识别的解决方案
查看>>
(5)Powershell别名(Alias)
查看>>
我的友情链接
查看>>