【0x50「动态规划」例题】LCIS【最长公共上升子序列】
题意:
给出两个数列 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<jandB[x]<B[j]dp[i−1][x]+1dp[i][j] = max_{x < j \ and \ B[x] < 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<jandB[x]<B[j]x < j \ and \ B[x] < B[j]x<j and B[x]<B[j] ,即 x<jandB[x]<A[i]x < j \ and \ B[x] < 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【最长公共上升子序列】相关推荐
- [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{ ...
- 一直学不明白的「递归」与「动态规划」原来这么简单
在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点. 程序员小吴打算使用动画的形式来帮助理解 ...
- 最长公共上升子序列 LCIS
关于子序列什么什么的问题,以前一直没怎么在意过,直到省赛突然考了一个赤裸裸的LCIS,这下才着急了,因为忘记怎么做了,而且模版也没有带.从第三名一直掉到第11名,而且超上来的,全都是会做这题的o(╯□ ...
- 【动态规划】最长公共上升子序列
问题 F: [动态规划]最长公共上升子序列 时间限制: 5 Sec 内存限制: 64 MB 提交: 34 解决: 9 [提交] [状态] [命题人:admin] 题目描述 研究发现,大猩猩的基因序 ...
- 最长公共上升子序列(LCIS)
题意: 求最长公共上升子序列 题解: 最长公共上升子序列 = 最长公共子序列(LCS)与最长上升子序列(LIS) LCS核心代码: for(int i=1;i<=n;i++){for(int j ...
- 最长上升子序列、最长公共子序列、最长公共上升子序列(LIS、LCS、LCIS)
LIS.LCS.LCIS 最长上升子序列LIS 最长公共子序列LCS 最长公共上升子序列LCIS 最长上升子序列LIS 题目链接:AcWing895. 最长上升子序列 这里只说明 O ( n 2 ) ...
- ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)
Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...
- HDU 4512 吉哥系列故事――完美队形I(最长公共上升子序列)
吉哥系列故事--完美队形I Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- BNUOJ 4215 最长公共连续子序列
最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class na ...
- codevs 2185 最长公共上升子序列--nm的一维求法
2185 最长公共上升子序列 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目 ...
最新文章
- 2019秋招AI岗位竞争究竟有多激烈?
- Linux下SSH命令使用方法详解
- Spring Cloud Eureka(四):Eureka 配置参数说明
- php打印输出小于10的数字,PHP 字符串输出 echo、print 与 printf 函数
- JavaScript 字符串处理方法总结
- disk genius_如何预约Apple Store商店或Genius Bar
- 非类型模板参数(参考《C++ Templates 英文版第二版》)
- 思维导图中的快捷键分享
- android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
- 【ML小结6】关联分析与序列模式关联分析
- android 线程使用监控思路分享
- 华为数通hcia认证考试题库有多少题?
- qmc3格式文件转为mp3
- js文本框设置必填项_表单字段必填项JS代码
- 证券运维外包第3个月工作总结
- 单片机的外部中断(二)
- mysql association_在mybatis的xml中添加association不生效
- Neo4j3-Neo4j基础操作(中)
- 2021百度Create大会(暨百度AI开发者大会)
- javascript将HTML页面导出为pdf
热门文章
- 程序员,保险公司招聘不要轻易跑过去,省省路费省省时间,别浪费感情,特别是招聘什么业务主管经理的...
- 异步时钟下跨时钟域信号处理
- 让Windows下的驱动乖乖在Linux中安家!
- 洛谷3374:树状数组1(线段树/树状数组模板)
- mysql配置ip和端口_连接(Connectivity)选项中,“TCP/IP”复选项选中表示启用TCP/IP网络协议,配置连接MySQL服务器的默认端口号为“3306”。_学小易找答案...
- 装ubuntu_系统安装_win10下安装Ubuntu后,启动时无win10选项的解决办法。
- 抖音服务器升级维护时间,抖音服务器升级要多久2021
- 文本文件与二进制的区别
- c语言操作数据库sql
- 电脑用电量_为什么换了智能电表后,我家用电量一下子多了这么多呢?