[题目描述] 给出两个序列,求出最长公共上升子序列的长度,并输出其中一个解. [题目链接] http://noi.openjudge.cn/ch0206/2000/ [算法] 经典问题,结合了LIS和LCS. [代码] #include <bits/stdc++.h> using namespace std; int len1,len2,i,j,ans,ri,rj; ],s2[],rec[][],dp[][]; void print(int x,int y) { switch(rec[x][y…
BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等.这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8…
lis: 复杂度nlgn #include<iostream> #include<cstdio> using namespace std; ],lis[],res=; int solve(int x) { ,b=res; while(a!=b) { ; if(lis[mid]>=x) b=mid; else a=mid+; } return a; } int main() { int n; cin>>n; ;i<=n;i++) scanf("%d&…
最长公共上升子序列LCIS,如字面意思,就是在对于两个数列A和B的最长的单调递增的公共子序列. 这道题目是LCS和LIS的综合. 在LIS中,我们通过两重循环枚举当序列以当前位置为结尾时,A序列中当前位置之前的数是否比当前位置的数大为条件,进行对于“最长上升子序列”的长度的转移. 方程简单的表示为:f[i] = max{f[i], f[j +1]}(0 <= j < i) 边界为f[0] = 0, 目标为max{f[i]}(1 <= I <= N) 在LCS中,我们使用二维数组,对…
This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence. InputEach sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - the sequence itself.Outpu…
Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1432 题目大意:给出两串数字,求他们的最长公共上升子序列(LCIS),并且打印出来. Sample Input 1 51 4 2 5 -124-12 1 2 4 Sample Output 21 4 分析:神奇就神奇在是LIS与LCS的组合 令dp[i][j]表示A串的前i个,与B串的前j…
  Virus  We have a log file, which is a sequence of recorded events. Naturally, the timestamps are strictly increasing. However, it is infected by a virus, so random records are inserted (but the order of original events is preserved). The backup log…
各种序列复习: (1)最长上升子序列. 1.这个问题用动态规划就很好解决了,设dp[i]是以第i个数字结尾的上升子序列的最长长度.那么方程可以是dp[i]=max(dp[j]+1).(j<i).复杂度为O(n^2); 2.另外有一个该经典问题的O(nlogn)算法. 首先知道,当求dp[i]时,如果出现a[k]<a[j],而dp[k]=dp[j]时,应当优先选k吧.那么,既然每次选的都是较小,就可以把字符串按照dp[t]=k这个子序列长度分类.当同样dp[t]=k时,记录下该长度的最小的a[p…
一. 知识简介 学习 LCIS 的预备知识: 动态规划基本思想, LCS, LIS 经典问题:给出有 n 个元素的数组 a[] , m 个元素的数组 b[] ,求出它们的最长上升公共子序列的长度. 例如: a[] data: 5 1 4 2 5 -12 b[] data: 4 -12 1 2 4 LCIS is 2 LCIS 所含元素为 1 4 二.LCIS问题分析 确定状态   可以定义 dp[i][j] 表示以 a 数组的前 i 个整数与 b 数组的前 j 个整数且以 b[j] 为结尾构成的…
最长公共上升子序列(LCIS)的O(n^2)算法 预备知识:动态规划的基本思想,LCS,LIS. 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列). 首先我们可以看到,这个问题具有相当多的重叠子问题.于是我们想到用DP搞.DP的首要任务是什么?定义状态. 1定义状态F[i][j]表示以a串的前i个字符b串的前j个字符且以b[j]为结尾构成的LCIS的长度. 为什么是这个而不是其他的状态定义?最重要的原因是我只会这个,还有一个原因是我知道这个定义能搞到平方的算法.而我这只会这个的…
题目描述 This problem differs from one which was on the online contest. The sequence a1,a2,...,an a_{1},a_{2},...,a_{n} a1​,a2​,...,an​ is called increasing, if ai<ai+1 a_{i}<a_{i+1} ai​<ai+1​ for i<n i<n i<n . The sequence s1,s2,...,sk s_{1…
题目大意:给定两个大小为n的数组,让你找出最长公共上升子序列的长度. 分析:这是一个比较好的dp题,LIS和LCS两大经典线性dp问题相结合,简称LCIS. 代码(O(n*n*n)写法): #include<bits/stdc++.h> using namespace std; ; int a[maxn],b[maxn]; int dp[maxn][maxn]; int main() { int n; cin >> n; ; i <= n; i++) cin >>…
每日一题 day16 打卡 Analysis 设F[i,j]表示A[1..i]与B[1..j]并且以B[j]结尾的两段最长公共上升子序列,那么我们可以发现这样的转移 (1)A[i]==B[j]时 F[i][j]=max(F[i-1][k])+1,其中k满足1<=k<=j并且B[j]<A[i]. (2)如果不相等: F[i][j]=F[i-1][j] 这样我们三重循环就可以搞定.但是这里是可以优化的. 我们考虑这样的一个事实:我们知道这样的一个事实,再第二层循环的时候,我们其实在枚举j.我…
第一次接触一个这最长公共上升子序列 不过其实搞清楚了跟最长公共子序列和 最长上升子序列如出一辙 两重循环,对于当前不相等的,等于前一个的值,相等的,等于比当前A[i]小的最大值+1.弄个临时变量记录最大值即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dp[2][1010]; int A[1010…
题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了. 小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了. 奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子串.不过,只要告诉奶牛它的长度就可以了. 输入描述 Input Descri…
最长公共上升子序列慕名而知是两个字符串a,b的最长公共递增序列,不一定非得是连续的.刚开始看到的时候想的是先用求最长公共子序列,然后再从其中找到最长递增子序列,可是仔细想一想觉得这样有点不妥,然后从网上看了一些大神的理解,觉得恍然大悟. 定义dp[i][j]表示字符串a前i个和字符串b的前j个且以b[j]结尾构成的最长公共上升子序列的长度,定义一个max用来保存最大的长度.用两个循环,外层循环控制字符串a,内层循环控制字符串b.如果a[i]不等于b[j],则dp[i][j]=dp[i-1][j]…
动态规划法: #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #inc…
Description 给定两个数列,求最长公共上升子序列,并输出其中一种方案. Input&Output Input 第一行一个整数n(0<n<=500),数列a的长度. 第二行n个空格隔开的整数,数列a的元素. 第三行一个整数m,数据范围同n,数列b的长度. 第四行m个空格隔开的整数,意义同第二行. Output 第一行一个整数k,LCIS的长度. 第二行k个空格隔开的整数,其中一种方案. Solution 对于这类问题我们通常有两种转移方式,一种是以i结尾的数列,另一种是前i个数…
题目链接: codevs 2185 最长公共上升子序列codevs 1408 最长公共子序列 题目描述 Description熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了.奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最…
问题 给定两个序列A和B,序列的子序列是指按照索引逐渐增加的顺序,从原序列中取出若干个数形成的一个子集,若子序列的数值大小是逐渐递增的则为上升子序列,若A和B取出的两个子序列A1和B1是相同的,则A1/B1为A和B的公共子序列.求出A和B的最长公共上升子序列. 分析     结合最长公共子序列和最长上升子序列来解决这个问题,定义状态dp[i][j]表示A串中前i个字符和B串中前j个字符且以B[j]为结尾的最长公共上升子序列的长度.则有状态转移方程:[在进行动态规划状态的设计的时候,要简单.详尽的…
2185 最长公共上升子序列  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond 题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了.奶牛半懂不懂…
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8768 Accepted Submission(s): 2831 Problem Description This is a problem from ZOJ 24…
Sample Input 5 1 4 2 5 -12 4 -12 1 2 4 Sample Output 2 1 4 题目:给你两个数字序列,求出这两个序列的最长公共上升子序列.输出最长的长度,并打表输出.可能存在多种正确答案,故此题是special judge! 分析:dp[i][j] : A[1...i]和B[1...j]的公共上升子序列中以B[j]为结尾的最长的长度.如果A[i] != B[j], 则dp[i][j]=d[i-1][j]; 也就是说当前这个A[i]是没效用的.如果A[i]…
[codevs2185]最长公共上升子序列 试题描述 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了.奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子串.不过,只要告诉奶牛它的长度就可以了. 输入 第一行N,表…
最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class name: Main   给你两个序列S1和S2,长度分别是L1,L2 (1 <= L1 , L2 <= 180).   写一个程序找出最长的连续公共子序列.   连续子序列定义为序列中连续的一个片段.例如序列"1 2 3"的子串有空串,"1","…
题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了.奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子串.不过,只要告诉奶牛它的长度就可以了. 输入描述 Input Descript…
题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列. 一个世界线的事件逻辑序列是一个正整数序列,第k个数表示第k个事件发生的时间.对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增. 现在,对于两个不同的世间线α,β求出最长的一个事件序列,满足这个序列在α,β世界线中均是合法的.这个序列也就是之前提到过的最…
题目传送门 Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10279    Accepted Submission(s): 3311 Problem Description This is a problem from ZOJ 2432.To make it…
题面 一道线性 DP 好题. 设 \(dp_{i,j}\) 表示在所有 \(a_{1\dots i}\),\(b_{1\dots j}\) 的子序列中,以 \(b_j\) 结尾的最长公共上升子序列的最大长度. 转移的时候考虑 \(2\) 种情况: 若不选择 \(a_i\),则 \(dp_{i,j}=dp_{i-1,j}\): 若选择 \(a_i\),则 \(dp_{i,j} = \max_{1\leq k \leq j,b_k < b_j}\{dp_{i-1,k}\}+1\).又因为有 \(a_…
1. 题目描述 给定两个数列\(A, B\),如果他们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列.求\(A\)和\(B\)的最长公共上升子序列. 输入格式 第一行包含一个整数\(N\),表示\(A\)和\(B\)的长度. 第二行包含\(N\)个整数,表示数列\(A\). 第三行包含\(N\)个整数,表示数列\(B\). 输出格式 输出一个整数,表示最长公共上升子序列的长度. 数据范围 \(1 ≤ N≤ 3000\),序列中的数字均不超过\(2^{3…