题意:

给出两个数列 AAA 和 BBB ,输出两个数列的最长公共上升子序列的长度。


思路:

我们可以仿照最长公共子序列的状态定义,来给出 LCISLCISLCIS 的状态定义,dp[i][j]dp[i][j]dp[i][j] 表示数列 AAA 中 [1,i][1,i][1,i] 与数列 BBB 中 [1,j][1,j][1,j] 的以 B[j]B[j]B[j] 为结尾的最长公共子序列长度。

因此我们可以给出一个 O(n3)O(n^3)O(n3) 复杂度的算法,当A[i]=B[j]A[i] = B[j]A[i]=B[j]时,dp[i][j]=maxx&lt;jandB[x]&lt;B[j]dp[i−1][x]+1dp[i][j] = max_{x &lt; j \ and \ B[x] &lt; B[j]\ } dp[i-1][x] + 1dp[i][j]=maxx<j and B[x]<B[j] ​dp[i−1][x]+1,而A[i]!=B[j]A[i] \ != B[j]A[i] !=B[j]时,dp[i][[j]=dp[i−1][j]dp[i][[j] = dp[i-1][j]dp[i][[j]=dp[i−1][j],由此即可完成这个 O(n3)O(n^3)O(n3) 的算法。

由此我们需要对这个算法进行优化,我们可以发现时间的浪费主要在于 A[i]=B[j]A[i] = B[j]A[i]=B[j] 时,我们需要到前面去找一个值来更新dp[i][j]dp[i][j]dp[i][j],但是条件却只是 x&lt;jandB[x]&lt;B[j]x &lt; j \ and \ B[x] &lt; B[j]x<j and B[x]<B[j] ,即 x&lt;jandB[x]&lt;A[i]x &lt; j \ and \ B[x] &lt; A[i]x<j and B[x]<A[i],由此我们可以发现当 iii 确定时,更新 jjj 时找到的 dp[i][x]dp[i][x]dp[i][x] 可以在更新 j+1j+1j+1 时继续利用,因此代码就缩减到了 O(n2)O(n^2)O(n2),即可完成本题。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 5000;int n;
int a[N],b[N],dp[N][N];//dp[i][j]: a序列1-i,b序列1-j,以b[j]为结尾的最长公共上升子序列int main()
{scanf("%d",&n);rep(i,1,n) scanf("%d",&a[i]);rep(i,1,n) scanf("%d",&b[i]);int ans = 0;rep(i,1,n){int val = 0;rep(j,1,n){if(b[j] == a[i]) dp[i][j] = val+1;else dp[i][j] = dp[i-1][j];if(b[j] < a[i]) val = max(val,dp[i-1][j]);ans = max(ans,dp[i][j]);}}printf("%d\n",ans);return 0;
}

【0x50「动态规划」例题】LCIS【最长公共上升子序列】相关推荐

  1. [2017纪中10-25]凤凰院修真 LCIS最长公共上升子序列

    题面 f[i][j]表示a序列考虑到i,b序列考虑到j且b[j]必须选的最长长度. a[i]!=b[j]时,f[i][j]=f[i-1][j]. 那么当a[i]==b[j]时,f[i][j]=max{ ...

  2. 一直学不明白的「递归」与「动态规划」原来这么简单

    在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点. 程序员小吴打算使用动画的形式来帮助理解 ...

  3. 最长公共上升子序列 LCIS

    关于子序列什么什么的问题,以前一直没怎么在意过,直到省赛突然考了一个赤裸裸的LCIS,这下才着急了,因为忘记怎么做了,而且模版也没有带.从第三名一直掉到第11名,而且超上来的,全都是会做这题的o(╯□ ...

  4. 【动态规划】最长公共上升子序列

    问题 F: [动态规划]最长公共上升子序列 时间限制: 5 Sec  内存限制: 64 MB 提交: 34  解决: 9 [提交] [状态] [命题人:admin] 题目描述 研究发现,大猩猩的基因序 ...

  5. 最长公共上升子序列(LCIS)

    题意: 求最长公共上升子序列 题解: 最长公共上升子序列 = 最长公共子序列(LCS)与最长上升子序列(LIS) LCS核心代码: for(int i=1;i<=n;i++){for(int j ...

  6. 最长上升子序列、最长公共子序列、最长公共上升子序列(LIS、LCS、LCIS)

    LIS.LCS.LCIS 最长上升子序列LIS 最长公共子序列LCS 最长公共上升子序列LCIS 最长上升子序列LIS 题目链接:AcWing895. 最长上升子序列 这里只说明 O ( n 2 ) ...

  7. ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)

    Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...

  8. HDU 4512 吉哥系列故事――完美队形I(最长公共上升子序列)

    吉哥系列故事--完美队形I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  9. BNUOJ 4215 最长公共连续子序列

    最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class na ...

  10. codevs 2185 最长公共上升子序列--nm的一维求法

    2185 最长公共上升子序列  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond 题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目 ...

最新文章

  1. 2019秋招AI岗位竞争究竟有多激烈?
  2. Linux下SSH命令使用方法详解
  3. Spring Cloud Eureka(四):Eureka 配置参数说明
  4. php打印输出小于10的数字,PHP 字符串输出 echo、print 与 printf 函数
  5. JavaScript 字符串处理方法总结
  6. disk genius_如何预约Apple Store商店或Genius Bar
  7. 非类型模板参数(参考《C++ Templates 英文版第二版》)
  8. 思维导图中的快捷键分享
  9. android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
  10. 【ML小结6】关联分析与序列模式关联分析
  11. android 线程使用监控思路分享
  12. 华为数通hcia认证考试题库有多少题?
  13. qmc3格式文件转为mp3
  14. js文本框设置必填项_表单字段必填项JS代码
  15. 证券运维外包第3个月工作总结
  16. 单片机的外部中断(二)
  17. mysql association_在mybatis的xml中添加association不生效
  18. Neo4j3-Neo4j基础操作(中)
  19. 2021百度Create大会(暨百度AI开发者大会)
  20. javascript将HTML页面导出为pdf

热门文章

  1. 程序员,保险公司招聘不要轻易跑过去,省省路费省省时间,别浪费感情,特别是招聘什么业务主管经理的...
  2. 异步时钟下跨时钟域信号处理
  3. 让Windows下的驱动乖乖在Linux中安家!
  4. 洛谷3374:树状数组1(线段树/树状数组模板)
  5. mysql配置ip和端口_连接(Connectivity)选项中,“TCP/IP”复选项选中表示启用TCP/IP网络协议,配置连接MySQL服务器的默认端口号为“3306”。_学小易找答案...
  6. 装ubuntu_系统安装_win10下安装Ubuntu后,启动时无win10选项的解决办法。
  7. 抖音服务器升级维护时间,抖音服务器升级要多久2021
  8. 文本文件与二进制的区别
  9. c语言操作数据库sql
  10. 电脑用电量_为什么换了智能电表后,我家用电量一下子多了这么多呢?