LIS LCS n^2和nlogn解法 以及LCIS】的更多相关文章

首先介绍一下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…
o(n^2)解法就不赘述了,直接解释o(nlogn)解法 LIS最长递增子序列: 先明确一个结论:在长度最大为len的递增序列里若末尾元素越小,该递增序列越容易和后面的子序列构造出一个更长的递增子序列.也即认为,长度为len的递增子序列中末尾元素最小的那种最需要保留.我们不妨称这个目前找到序列为到目前为止的 最优序列. 因此设置一个数组lis[i]其中 i 表示此时最大递增序列的长度,数组值表示此时达到 i 的最优序列(也即 长度为len的递增子序列中末尾元素最小的那种)的末尾元素. 那么此时只…
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(nlogn) #include<iostream> #include<cstdio> using namespace std; ; int a[maxn]; int n; int lis[maxn]; ; int find(int x){ ,r=len,m; while(l<r){ m=l+(r-l)/; if(lis[m]>=a[x]){//这里若去掉等号即为 非严格递增序列 r=m; } else{ l=m+; } } return l; } int mai…
感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸 地址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 &…
做了一段时间的线性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…
动态规划的一般思路是分为四步,即:寻找最优子结构.递归定义最优子结构.自底向上求解最优子结构和构造最优解. 接下来我列举出几个常见的动态规划面试题进行说明. (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)…
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]…
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…