题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=1000001<=n<=1000001<=n<=100000 和On^2算法不同,dp数组存储的不再是子序列长度了,而是一个最小的递增子序列.用len这个变量存储最小子序列的长度(或者说末尾位置),当a[i]>dp[len]时直接把a[i]添加到子序列的末尾,当a[i]<=dp…
给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序列的长度   题解   这里给出两种方法,先说经典版本的,设dp[i]表示以以 a[i]为结尾的LST的长度,n方的暴力很好想,显然我们在i之间找到一个最大的LST,且要保证a[j]<a[i],那么显然dp[i]=max(dp[i],dp[j]+1),那么这个dp显然就是在i之前找到一个以小于a[i…
最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i]. 这样简单的复杂度为O(n^2),其实还有更好的方法. 考虑两个数a[x]和a[y],x&…
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长.输出这个最长的长度.(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题都看成同一个问题,其实仔细思考就会发现,这其实只是<符号定义上的问题,并不影响问题的实质)例如有一个序列:1  7  3  5  9  4  8,它的最长上升子序列就是 1 3 4 8…
最长递减子序列(nlogn): int find(int n,int key) { ; int right=n; while(left<=right) { ; if(res[mid]>key) { left=mid+; } else { right=mid-; } } return left; } int Lis(int a[],int n) { ; res[r]=a[]; r++; ;i<n;i++) { ]>a[i]) { res[r]=a[i]; r++; } else {…
1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个数N,N为序列的长度(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9) Output 输…
洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路: \(n^2\)很好做,不赘述. 这里有个很好的一点就是两个序列都一定是全排列,说明两个序列的元素出现的位置不一样而已,但是数字是一样的. 通过\(vis\)来记录\(A\)序列的数字出现的位置,自然也可以对应到\(B\)的位置. 接下来的步骤看样例解释一下吧. 比如说\(A\)串:\(3\ 2\…
一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外的数组 LIS 来记录 长度从1 到 n 慢慢变长求解的过程中 对应长度的 最长递增子序列的最小的末尾元素 解决方法 长度为1时 {3}: 将3放入LIS中,表示长度为1的时候,{3}数组的最长递增子序列的最小微元素 LIS:{3} 只有一个元素,所以 最长递增子序列就是 {3},最长递增子序列的最…
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就是序列A和B的最长公共子序列LCS,即LIS(A) = LCS(A,B).时间复杂度为n^2. 思路二:动态规划.时间复杂度为n^2,可以进一步优化为n^lgn. [代码]  C++ Code  1234567891011121314151617181920212223242526272829303…
题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(dp[k])+1,(k<i),(a[k]<a[i]) #include <stdio.h> #define MAX 1005 int a[MAX];///存数据 int dp[MAX];///dp[i]表示以a[i]为结尾的最长递增子序列(LIS)的长度 int main() { int…