最长不下降子序列 (3种做法)
2017-09-25 19:54
246 查看
最长不下降子序列,顾名思义就是总一组数据中找到一组最长数,这一组数据保证是b[0]<=b[1]<=b[2]......<=b[n-1]
最简单的是朴素算法,还有dp的nlogn , stack nlogn 算法宝典416页
具体思路不说了,忘了记得多看看书。
///stack优化 nlogn
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
const int maxn = 10000 + 10 ;
int a[maxn] , mystack[maxn] ;
int main()
{
int n ;
while(scanf("%d" , &n) != EOF)
{
memset(mystack , 0 , sizeof(mystack)) ;
int temp ;
int top = 0 ;
mystack[0] = -1 ;
for(int i = 1 ; i <= n ; i++) {
scanf("%d" , &temp) ;
if(mystack[top] < temp)
{
mystack[++top] = temp ;
}
else
{
int l = 1 , r = top , mid ;
while(l <= r)
{
mid = (l + r) >> 1 ;
if(mystack[mid] < temp)
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
mystack[l] = temp ;
}
}
printf("%d\n" , top) ;
}
return 0 ;
}
///初步优化nlogn
/*
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
const int maxn = 1000 + 10 ;
int a[maxn] , mark[maxn] , len ;
int tofind(int x)
{
int l = 1 , r = len , mid ;
while(l <= r)
{
mid = (l + r) >> 1 ;
if(mark[mid] < x)
l = mid + 1;
else
r = mid - 1 ;
}
return l ;
}
int main()
{
int n ;
while(scanf("%d" , &n) != EOF)
{
for(int i = 1 ; i <= n ; i++)
{
scanf("%d" , &a[i]) ;
}
len = 1 ;
mark[len] = a[len] ;
for(int i = 2 ; i <= n ; i++)
{
if(a[i] > mark[len])
{
mark[++len] = a[i] ;
}
else
{
int findpos = tofind(a[i]) ;
mark[findpos] = a[i] ;
}
}
printf("%d\n" , len) ;
}
return 0 ;
}
*/
///朴素算法
/*#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ;
const int maxn = 10000 + 10 ;
int a[maxn] , mark[maxn] ;
int main()
{
int n ;
while(scanf("%d" ,&n) != EOF)
{
int maxlen = 1 ;
for(int i = 0 ; i
4000
< n ; i++) {
scanf("%d" , a + i) ;
mark[i] = 1 ;
}
for(int i = n-1 ; i>= 0 ; i--)
{
for(int j = i + 1 ; j < n ; j++)
{
if(a[i] <= a[j])
{
mark[i] = max(mark[i] , mark[j] + 1) ;
maxlen = max(maxlen , mark[i]) ;
}
}
}
printf("%d\n" , maxlen) ;
}
}
*/
最简单的是朴素算法,还有dp的nlogn , stack nlogn 算法宝典416页
具体思路不说了,忘了记得多看看书。
///stack优化 nlogn
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
const int maxn = 10000 + 10 ;
int a[maxn] , mystack[maxn] ;
int main()
{
int n ;
while(scanf("%d" , &n) != EOF)
{
memset(mystack , 0 , sizeof(mystack)) ;
int temp ;
int top = 0 ;
mystack[0] = -1 ;
for(int i = 1 ; i <= n ; i++) {
scanf("%d" , &temp) ;
if(mystack[top] < temp)
{
mystack[++top] = temp ;
}
else
{
int l = 1 , r = top , mid ;
while(l <= r)
{
mid = (l + r) >> 1 ;
if(mystack[mid] < temp)
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
mystack[l] = temp ;
}
}
printf("%d\n" , top) ;
}
return 0 ;
}
///初步优化nlogn
/*
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
const int maxn = 1000 + 10 ;
int a[maxn] , mark[maxn] , len ;
int tofind(int x)
{
int l = 1 , r = len , mid ;
while(l <= r)
{
mid = (l + r) >> 1 ;
if(mark[mid] < x)
l = mid + 1;
else
r = mid - 1 ;
}
return l ;
}
int main()
{
int n ;
while(scanf("%d" , &n) != EOF)
{
for(int i = 1 ; i <= n ; i++)
{
scanf("%d" , &a[i]) ;
}
len = 1 ;
mark[len] = a[len] ;
for(int i = 2 ; i <= n ; i++)
{
if(a[i] > mark[len])
{
mark[++len] = a[i] ;
}
else
{
int findpos = tofind(a[i]) ;
mark[findpos] = a[i] ;
}
}
printf("%d\n" , len) ;
}
return 0 ;
}
*/
///朴素算法
/*#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ;
const int maxn = 10000 + 10 ;
int a[maxn] , mark[maxn] ;
int main()
{
int n ;
while(scanf("%d" ,&n) != EOF)
{
int maxlen = 1 ;
for(int i = 0 ; i
4000
< n ; i++) {
scanf("%d" , a + i) ;
mark[i] = 1 ;
}
for(int i = n-1 ; i>= 0 ; i--)
{
for(int j = i + 1 ; j < n ; j++)
{
if(a[i] <= a[j])
{
mark[i] = max(mark[i] , mark[j] + 1) ;
maxlen = max(maxlen , mark[i]) ;
}
}
}
printf("%d\n" , maxlen) ;
}
}
*/
相关文章推荐
- 最长不下降子序列 (nlgn)做法
- 最长不下降子序列(n log n)做法
- 求最长下降子序列的长度及不重复次数
- hdu5748(最长不下降序列)
- 最长不下降字序列
- 分支限界法解决 二维最长下降序列问题(滑雪场问题)
- 最长上升或下降子序列解法 总结
- C++ 关于最长下降子序列问题
- 【网络流24题】最长不下降子序列问题
- [模型转化 最长下降子序列] BZOJ 2924 [Poi1998]Flat broken lines
- tyvj 1049 最长不下降子序列 n^2/nlogn
- 求最长不下降序列
- 求最长不下降序列-SSL 1459
- (ssl1459)求最长不下降序列
- 【动态规划】【二分】【最长下降子序列】XMU 1041 Sequence
- 一维数组中最长递增子序列的长度(DP做法)
- hdoj1160 FatMouse's Speed ( STL + 最长下降子序列 /DP)
- 最长不下降序列nlogn算法
- 最长上升序列、最长下降序列及其变形模板
- 20180321最长不下降序列