最长上升子序列 nlogn】的更多相关文章

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p排序也是一样的.但这题的n的范围是5*10^5次方,所以用n^2算法求 最长上升子序列肯定不行,下面简单介绍一下nlogn时间内求的方法: 从序列里面每次插入一个数,插入到另外一个数组里面,这个数组初始状态是空的,插入一个数时,如果这个数比这个数组里面的任何一个数都大,则直接插入到最后面,否则判断这…
转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 (修正了一些错误,并自己重写了代码) 最长公共子序列(LCS)最常见的算法是时间复杂度为O(n^2)的动态规划(DP)算法,但在James W. Hunt和Thomas G. Szymansky 的论文"A Fast Algorithm for Computing Longest Common Subsequence"中,给出了O(nlogn)下限的一种算法. 定理:设…
题目链接:http://poj.org/problem?id=2533 其实这个题的数据范围n^2都可以过,只是为了练习一下nlogn的写法. 最长上升子序列的nlogn写法有两种,一种是变形的dp,另一种是树状数组. 变形的dp可以参考http://www.cnblogs.com/itlqs/p/5743114.html 树状数组的写法其实就是用到了树状数组求前缀最值,必要的时候可以离散化一下. #include<cstdio> #include<cstring> #includ…
分析: 给一个序列,求出每个位置结尾的最长上升子序列 O(n^2) 超时 #include "cstdio" #include "algorithm" #define N 1005 #define INF 0X3f3f3f3f using namespace std; int a[N]; int dp[N]; void solve(int n) { ;i<n;i++) { dp[i]=; ;j<i;j++)///往前找寻美妙的回忆 { if(a[j]&l…
先来个板子 #include<bits/stdc++.h> using namespace std; , M = 1e6+, mod = 1e9+, inf = 1e9+; typedef long long ll; struct node { int c; int num; } u[N]; ,n,m,x,y = ,T = ,ans = ,big = ,cas = ,num = ,len = ; ; bool cmp(node a,node b) { if (a.c==b.c) return…
openjudge 百练 2757:最长上升子序列 总时间限制:  2000ms 内存限制:  65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上…
普通的思路是O(n2)的复杂度,这个题的数据量太大,超时,这时候就得用nlogn的复杂度的算法来做,这个算法的主要思想是只保存有效的序列,即最大递增子序列,然后最后得到数组的长度就是最大子序列.比如序列7 8 9 1 2 3 来说, 就是先把第一个数输入到数组中,然后继续输入后面的数,每输入一个数都要和最后一个数比较,因为这时最后一个数一定是有效序列中最大的,如果大于最后一个数,那么就直接将它放到数组的最后就行了,如果不大于最后一个数的话,就找到第一个比他大的数,然后替换它,样例中,先输入进去7…
LIS问题是经典的动态规划问题,它的状态转移相信大家都很熟悉: f[i] = f[k] + 1  (k < i 且 A[k] < A[i]) 显然这样做复杂度是O(n^2) 有没有更快的算法呢? 当然,你会发现你在往前找的过程中实际上就是在查询最大值的过程,如果能应用二分就很有机会降到nlogn 但是原f[]序列并不满足二分性质呐..怎么办呢? 我们要的是往前长度最大的,我们的二分目标就是长度 不妨开一个长度数组len[i],表示长度为i的上升子序列最后末尾的值的最小值 对于没算出的len,设…
费了好大劲写完的  用线段树维护的 nlogn的做法再看了一下 大神们写的 nlogn  额差的好远我写的又多又慢  大神们写的又少又快时间  空间  代码量 哪个都赶不上大佬们的代码 //这是我写的 #include<iostream> #include<stdio.h> #include<map> #include<vector> #include<algorithm> #include<cstring> using namesp…
简单. #include<cstdio> #include<cstring> #include<iostream> using namespace std; ; int a[MAXN],s[MAXN]; int serch(int left, int right, int v) { int l, r, m; l = left, r = right; while(l <= r) { m = (l + r) / ; if(v > s[m]) l = m + ;…
水,坑. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; ; struct node { int x; int y; }a[MAXN]; int s[MAXN]; bool cmp(node t1,node t2) { return t1.x<t2.x; } int serch(int left, int rig…
; LL num[N]; LL dp[N]; LL go(LL l, LL r, LL k) { for (; r >= l; r--) if (dp[r] <= k) return r; return l; } LL bins(LL l, LL r, LL k) { ) { ) return go(l, r, k); LL mid = (l + r) >> ; if (dp[mid] > k) r = mid; else l = mid; } } LL solve(LL n…
问题描述: 一个数的序列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…
最长上升子序列(LIS)的典型变形,熟悉的n^2的动归会超时.LIS问题可以优化为nlogn的算法.定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素.注意d中元素是单调递增的,下面要用到这个性质.首先len = 1,d[1] = a[1],然后对a[i]:若a[i]>d[len],那么len++,d[len] = a[i];否则,我们要从d[1]到d[len-1]中找到一个j,满足d[j-1]<a[i]<d[j],则根据D的定义,我们需…
//Accepted 4372 KB 140 ms //dp 最长上升子序列 nlogn #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; int dp[imax_n]; int d[imax_n]; int a[imax_n]; int n; int len; int max(int a,int b) { return a>b?a:b; } int bi…
题目 #include<stdio.h> //最长上升子序列 nlogn //入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现 //数组下标从1号开始. int bsearch(int a[],int len,int num) { ,right=len; while(left<=right) { ; if(num<=a[mid]) //若最长不下降子序列,改<= 为 < right=mid-; else left=mid+; } return le…
Beautiful People Special JudgeTime Limit: 10000/5000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description The most prestigious sports club in one city has exactly N members. Each of its members is…
题意:最长上升子序列nlogn写法 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ]; ]; int main(){ int n; while(cin>>n){ ;i<n;i++){ cin>>a[i]; } memset(dp,,sizeof(dp)); dp[]=a[]; ; ;i&…
转载自:最长上升子序列(LIS)长度的O(nlogn)算法 最长上升子序列nlogn算法 在川大oj上遇到一道题无法用n^2过于是,各种纠结,最后习得nlogn的算法 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS.排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5.n下面一步一步试着找出它.我们定义一个序列B,然后令 i = 1…
普通做法是O(n^2)下面介绍:最长上升子序列O(nlogn)算法(http://blog.csdn.net/shuangde800/article/details/7474903) /* HDU 1950 Bridging signals -----最长上升子序列nlogn算法 */ #include<cstdio> #include<cstring> #define MAXN 40005 int arr[MAXN],ans[MAXN],len; /* 二分查找. 注意,这个二分…