O(n log n)求最长上升子序列与最长不下降子序列

考虑dp(i)表示新上升子序列第i位数值的最小值.由于dp数组是单调的,所以对于每一个数,我们可以二分出它在dp数组中的位置,然后更新就可以了,最终的答案就是dp数组中第一个出现正无穷的位置。

代码非常简单:

 for(int i=0;i<n;i++)dp[i]=oo;
 for(int i=0;i<n;i++)*lower_bound(dp,dp+n,A[i])=A[i];
 printf("%d\n",(lower_bound(dp,dp+n,oo)-dp)); 

如果是最长不下降子序列的话只需要把第二行的lower_bound改成upper_bound就可以了。

如果是最长下降子序列或者最长不上升子序列的话只需要把原序列倒过来做一遍就好了。

时间: 2024-10-18 07:03:24

O(n log n)求最长上升子序列与最长不下降子序列的相关文章

最长下降子序列O(n^2)及O(n*log(n))解法

求最长下降子序列和LIS基本思路是完全一样的,都是很经典的DP题目. 问题大都类似于 有一个序列 a1,a2,a3...ak..an,求其最长下降子序列(或者求其最长不下降子序列)的长度. 以最长下降子序列为例 用a[i]存储序列a的第i个元素(i: 1 to n) 用f[i]表示算上第i个位置的元素时最长子序列为f[i], O(n^2)解法: 就是说在1 --- i -1之间必可以找到下标为j的元素a[j]使得f[j]是f[1]---f[i-1]之中最大的,则f[i] = f[j] + 1.

POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)

Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14094   Accepted: 6244 Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation,

(hdu step 3.2.4)FatMouse&#39;s Speed(在第一关键字升序的情况下,根据第二关键字来求最长下降子序列)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1034 Accepted Submission(s): 526   Proble

POJ - 3261 Milk Patterns (后缀数组求可重叠的 k 次最长重复子串)

Description Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can't predict the quality of milk from one day to the next, there are some regular pattern

poj 3261 求可重叠的k次最长重复子串

题意:求可重叠的k次最长重复子串的长度 链接:点我 和poj1743差不多 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000

Java算法——求出两个字符串的最长公共字符串

问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别以行和列组成一个二维矩阵. 2.比较二维矩阵中行和列对应的每个点的字符是否相同,是设置这个点为1,否设置这个点为0. 3.通过查找值为1的最长对角线来找到最长公共字符串. 通过上面str1和str2两个字符串,分别得出以行和列组成的一个二维矩阵如下图: 从上图可以看到,str1和str2共有3个公共子串&qu

【模板】最长不下降子序列

====接力dalao完成==== 前文链接:(CSP-S RP++!) 对前文的一些补充: 首先清楚最长不下降子序列是一个递增但是允许不同位元素相等的序列.而最长上升子序列则是一个单调递增的序列. 而两者都是子序列,所以子序列的长度一定小于等于原序列.且子序列在原序列的位置不一定连续. 这个O(nlogn)的算法使用的是贪心的思想. 为了帮助理解,请与以下代码对比阅读: #include<iostream> using namespace std; int a[1000001],dp[100

BUY LOW, BUY LOWER_最长下降子序列

Description The advice to "buy low" is half the formula to success in the bovine stock market.To be considered a great investor you must also follow this problems' advice: "Buy low; buy lower" Each time you buy a stock, you must purcha

【Android端 APP 启动时长获取】启动时长获取方案及具体实施

一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分配一个新的进程给应用. (2)热启动:程序的进程依然存在,启动时通过已有进程启动进入到Activity显示页面的,就是热启动,或者从Android官网来看我们获取到的其实是温启动时长,就是Activity不存在的情况. (3)新装包的启动时长: 新装包的启动时长,预估是最长的,并且在5.0以下及5.