您的位置:首页 > 其它

最长不下降子序列 (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) ;
}
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: