8.3 LIS LCS LCIS(完结了==!)】的更多相关文章

感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸 地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28195#overview 密码  acmore Problem A HDU 1159 Common Subsequence 这算是LCS里面最简单了的吧 解题方法见http://www.cnblogs.com/gj-Acit/p/3236384.html 下面随便贴上两段代码 #include <stdio.h> #include &…
PS:本篇博文均采用宏#define FOR(i, a, n) for(i = a; i <= n; ++i) LIS:最长上升子序列 废话不多说:http://baike.baidu.com/link?url=bRXFb18sGwPcKpplIIIq40hnngEUJe6S4b1PLgVnaby8zaahrO2NhI2tfoQZmw54#2_1 http://www.nocow.cn/index.php/%E6%9C%80%E9%95%BF%E4%B8%8D%E4%B8%8B%E9%99%8D…
只详细讲解LCS和LCIS,别的不讲-做题优先. 菜鸟能力有限写不了题解,可以留评论,我给你找博客. 先得理解最长上升子序列吧,那个HDOJ拦截导弹系列可以做一下,然后用o(n)log(n)的在做一遍 然后就是真正理解LCS: 真正理解源于做题,做题就像查漏补缺一样,你总有不会的地方. [完全的求一个最长公共子序列] (非常彻底地理解路径或者说是状态转移的规律) 先是初始化 付一个0的dp数组,把dp作为一个介体达到一种最长公共子序列的目的 然后就开始更新dp的值,dp的状态转移方程OK,然后根…
1. LIS (Longest Increasing Subsequence) O (n^2): /* LIS(Longest Increasing Subsequence) 最长上升子序列 O (n ^ 2) 状态转移方程:dp[i] = max (dp[j]) + 1 (a[j] < a[i],1 <= j < i) 附带有print输出路径函数 */ void LIS(void) { int ret = 0, last = 0; for (int i=1; i<=n; ++i…
LIS #include<bits/stdc++.h> using namespace std; int n,a[100005],b[100005],ji; int main(){ cin>>n; for(int i=1;i<=n;i++){cin>>a[i];} b[++ji]=a[1]; for(int i=2;i<=n;i++){ if(a[i]>b[ji]){ b[++ji]=a[i]; continue; } int mid,l=1,r=ji…
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { if(dp[i-1]>=0) dp[i]=dp[i-1]+a[i]; else dp[i]=a[i]; } 例题 裸的最长字段和 可以用滚动数组,下面是用滚动数组写的 #include <iostream> #include <algorithm> #include <s…
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由于是用迭代法,所以计算DP[i][j]前,DP[i-1][j]和DP[i][j-1]就都已经计算出来了,不难理解就可以得出状态转移方程: DP[i][j]  = DP[i-1][j-1] + 1;   如果a[i] == b[j] MAX(DP[i-1][j], DP[i][j-1])  如果a[i…
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由于是用迭代法,所以计算DP[i][j]前,DP[i-1][j]和DP[i][j-1]就都已经计算出来了,不难理解就可以得出状态转移方程: DP[i][j]  = DP[i-1][j-1] + 1;   如果a[i] == b[j] MAX(DP[i-1][j], DP[i][j-1])  如果a[i…
1.最长上升子序列(LIS) 子序列: 1.可以不连续 2.相对位置不变 dp[i][j] 表示前i位置,最大值为j的LIS长度 1. dp[i-1][j] 前i-1位置,最大值为j的LIS长度 (没有考虑a[i]) 2. dp[i][j]=dp[i-1][k]+1 (j==a[i] k < j) ans=max(dp[n][i]) DP复杂度:状态数量*单个状态转移复杂度 O(n^2) 空间 O(n^2) 序列: 前i个位置,以第i个位置结尾. f[i] 以第i个位置结尾的LIS长度 f[i]…
动态规划的一般思路是分为四步,即:寻找最优子结构.递归定义最优子结构.自底向上求解最优子结构和构造最优解. 接下来我列举出几个常见的动态规划面试题进行说明. (1)数学三角形:比较简单,直接贴一个我看到的讲得最清楚的文章,http://blog.csdn.net/baidu_28312631/article/details/47418773 (2)LIS:最长上升子序列问题. 思路1: 其实就是寻找f(n)和f(n-1)之间的关系,对于一个序列,f(n)要么等于f(n-1),要么等于f(n-1)…
白书例题,元素互不相同通过哈希转换为LIS求LCS #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #include<vector> #include<stack> #include<queue…
[题目描述] 给出两个序列,求出最长公共上升子序列的长度,并输出其中一个解. [题目链接] 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…
最长上升子序列,问题定义:http://blog.csdn.net/chenwenshi/article/details/6027086 代码: public static void getData( char[] L ) { int len = L.length; int[] f = new int[len]; String[] res = new String[len]; ; i < len; i++ ) { f[i] = ; res[i] = "" + L[i]; ; j…
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~~ 数据结构和算法模板系列之总览 很早前就打算将自己学过的数据结构和算法等知识和模板做个整理,但一直没有抽出时间来弄.现在打算抽空一点时间陆陆续续地将自己平时用的模板都贴上来,这里先做个综述. 主要针对那些想要准备机试.刷题或者刚刚接触ACM的初学者来说,对于A…
Problem Description This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence.   Input Each sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - th…
一道二分答案裸题,一道dp,一道各种裸题的混合(树上差分+二分答案+LCA) stone: 二分查找裸题啊: int check(int x) { ,last=; ;i<=n;i++) if(a[i]-a[last]<x) cnt++;//已经是最小值了,所以没有比他更小的,有更小的就要移开 else last=i;//推起走 ; ; } void find(int l,int r) { while(l<=r) { ; if(check(mid)) { ans=max(ans,mid);…
1.筛\(phi\) \(logn\)求少数\(phi\) inline int phi(R int x){ R int res=x,tmp=x; for(R int i=2;i*i<=x;i++){ if(tmp%i==0)res=res*(i-1)/i; while(tmp%i==0)tmp/=i; } if(tmp>1)res=res*(tmp-1)/tmp; return res; } 线性求\(phi\) inline void getphi(R int n){ vis[1]=0;…
点击打开题目链接 本题目是考察  最长递增子序列的  有n^2     n(logn)  n^2  会超时的 下面两个方法的代码  思路  可以百度LIS  LCS dp里面存子序列 n(logn)   代码 <span style="font-size:18px;">#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #inc…
for(int i = 1;i <= n;i++) { int dpmax = 0; for(int j = 1;j <= m;j++) { dp[i][j] = dp[i-1][j]; if(a[i] > b[j] && dpmax < dp[i-1][j])dpmax = dp[i-1][j]; if(a[i] == b[j])dp[i][j] = dpmax + 1; ret = max(ret,dp[i][j]); } } LCS最长公共子序列: 状态方程是…
/************************* LCS/LIS/LCIs模板总结: *************************/ /***************************************************** LCS:最长公共子序列 求长度为 len1 的序列 A 和长度为 len2 的序列 B 的LCS 注意:序列下标从 0 开始 滚动数组写法. 返回 LCS 长度 ******************************************…
网站:CSUST 8月3日(LCS,LIS,LCIS) LCS:      以下讲解来自:http://blog.csdn.net/yysdsyl/article/details/4226630 [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1…
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…
https://blog.csdn.net/someone_and_anyone/article/details/81044153 当串1 和 串2 的位置i和位置j匹配成功时, dp[i][j]=dp[i-1][j-1]+1,也就是说此状态由状态dp[i-1][j-1]转移而来,用数组记录为1, 当匹配不成功时,dp[i-1][j]和dp[i][j-1]去一个最大的,用数组分别记为2和3. 根据记录数组寻找路径: 当记录数组为1时,说明次时的i和j想等,并且此状态由i-1和j-1转移而来,所以…
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj.例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列. 考虑最长公共子序列问题如何分解成…
morestep学长出题,考验我们,第二题裸题但是数据范围令人无奈,考试失利之后,刻意去学习了下优化的算法 一.O(nlogn)的LIS(最长上升子序列) 设当前已经求出的最长上升子序列长度为len.先判断A[t]与D[len].若A [t] > D[len],则将A[t]接在D[len]后将得到一个更长的上升子序列,len = len + 1, D[len] = A [t]:否则,在D[1]..D[len]中,找到最大的j,满足D[j] < A[t].令k = j + 1,则有A [t] &…
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个序列中的部分(不要求连续),这个就叫做公共子序列,然后最长公共子序列自然就是所有的子序列中最长的啦. 既然是动态规划,难点肯定是在转移方程那了.首先我们用一张网上流传的图: 我个人觉得这张图最好的阐述了这个问题的解法.下面说一下我的理解:首先我们要考虑怎么表示LCS中的各个状态,这个知道的可能觉得很…
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的最长公共子串方法.最长公共子串用动态规划可实现O(n^2)的时间复杂度,O(n^2)的空间复杂度:还可以进一步优化,用后缀数组的方法优化成线性时间O(nlogn):空间也可以用其他方法优化成线性.3.LIS(最长递增序列)DP方法可实现O(n^2)的时间复杂度,进一步优化最佳可达到O(nlogn)…
题目大意 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 题解 这个是大白书上的例题,不过这题真的很好,很考验思维.因为p和q都是250^2=62500,如果用LCS的话时间复杂度是O(pq),显然会超时....不过这题的两个序列很特殊,就是没有重复的元素,这样可以把A中的元素重新编号为1~p+1.然后B根据A也重新编号,这样,新的A和B的LCS实际上就是新的B的LIS.LIS可以在O(…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列的最长公共子列. 思路:LCS转变为LIS,对于每个在第一个数组中出现的数字,将它转变为在第二个数组里出现的位置,注意这个位置要从大到小排,然后对这个数组做LIS. #include<algorithm> #include<cstdio> #include<cmath> #…