题目大意:求一个数列的最长上升子序列(严格上升)。

解题思路:

方法一:O(n^2)

dp[i]:表示处理到第i个位置,序列的最长上升子序列末尾为i的长度; a[]数组存储原序列

dp[i] = max{dp[j]+1},a[i]>a[j],0≤j≤i

方法二:O(nlogn)

复杂度降低其实是因为这个算法里面用到了二分搜索。本来有N个数要处理是O(n),每次计算要查找N次还是O(n),一共就是O(n^2);现在搜索换成了O(logn)的二分搜索,总的复杂度就变为O(nlogn)了。

这个算法的具体操作如下:

开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp < top则二分查找栈中的比temp大的第1个数,并用temp替换它。最长序列长度即为栈的大小top。

道理:对于数列中的a[i] 和a[j] ,i < j , 假设a[ i ]已在栈stap中,a[ j ] 未在栈中,这时读到元素a[ j ] , 如果a[ j ] < a[ i ](此时a[j]必然小于栈顶元素), 将a[j]与 a[i] 互换,此时这个栈的大小没有变化,但这个栈的“潜力”变大了,因为如果存在a[ j ] < a[ z ] < a[ i ] (i < j < z) ,当a[ i ]为栈顶元素时,a[ j ] 替换 a[ i ]后成为栈顶元素,此后在读到a[ z  ] 时就能把a[z] 压入栈,栈的大小就增加 1 , 即最长上升子序列长度就增加了1。

举例:原序列为1,5,8,3,6,7

栈为1,5,8,此时读到3,用3替换5,得到1,3,8; 再读6,用6替换8,得到1,3,6;再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。

请看代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std ;
const int MAXN = 1e3 + 5 ;
int s[MAXN] ;
int dp[MAXN] ;
int n ;
int stap[MAXN] ;
int top ;
void init()
{
int i , j ;
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &s[i]) ;
}
}
void solve() // O(n^2) 算法
{
int i , j ;
dp[1] = 1 ;
for(i = 2 ; i <= n ; i ++)
{
dp[i] = 1 ;
for(j = 1 ; j < i ; j ++)
{
if(s[i] > s[j] && dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1 ;
}
}
}
int MAX = -1 ;
for(i = 1 ; i <= n ; i ++)
{
if(MAX < dp[i])
MAX = dp[i] ;
}
printf("%d\n" , MAX) ;
} void solve2() // O(n log n) 算法
{
top = 0 ;
stap[++ top] = s[1] ;
int i ;
for(i = 2 ; i <= n ; i ++)
{
if(s[i] > stap[top])
{
stap[++ top] = s[i] ;
}
else if(s[i] < stap[top])
{
int left , right , mid ;
left = 1 ;
right = top ;
while (left < right)
{
mid = (left + right) / 2 ;
if(stap[mid] < s[i])
{
left = mid + 1 ;
}
else if(stap[mid] == s[i])
{
break ;
}
else
{
right = mid ; // 注意不是 mid - 1 !!
}
}
mid = (left + right) / 2 ;
stap[mid] = s[i] ;
}
}
printf("%d\n" , top) ;
}
int main()
{
while (scanf("%d" , &n) != EOF)
{
init() ;
//solve() ;
solve2() ;
}
return 0 ;
}

POJ 2533 Longest Ordered Subsequence - from lanshui_Yang的更多相关文章

  1. poj 2533 Longest Ordered Subsequence 最长递增子序列

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098562.html 题目链接:poj 2533 Longest Ordered Subse ...

  2. POJ 2533 Longest Ordered Subsequence(裸LIS)

    传送门: http://poj.org/problem?id=2533 Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 6 ...

  3. POJ 2533 Longest Ordered Subsequence(LIS模版题)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 47465   Acc ...

  4. POJ 2533 - Longest Ordered Subsequence - [最长递增子序列长度][LIS问题]

    题目链接:http://poj.org/problem?id=2533 Time Limit: 2000MS Memory Limit: 65536K Description A numeric se ...

  5. POJ 2533 Longest Ordered Subsequence(最长上升子序列(NlogN)

    传送门 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subseque ...

  6. POJ 2533 Longest Ordered Subsequence 最长递增序列

      Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

  7. poj 2533 Longest Ordered Subsequence(LIS)

    Description A numeric sequence of ai is ordered ifa1 <a2 < ... < aN. Let the subsequence of ...

  8. POJ 2533 Longest Ordered Subsequence(DP 最长上升子序列)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 38980   Acc ...

  9. Poj 2533 Longest Ordered Subsequence(LIS)

    一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

随机推荐

  1. android showAsDropDown的用法属性介绍

    使用PopupWindow可实现弹出窗口效果,,其实和AlertDialog一样,也是一种对话框,两者也经常混用,但是也各有特点.下面就看看使用方法.首先初始化一个PopupWindow,指定窗口大小 ...

  2. margin:0 auto 与 text-align:center 的区别(转载)

    摘自:http://www.cnblogs.com/zhwl/p/3529473.html 基本概念: 1.text-align: 属性规定元素中的文本的水平对齐方式;   该属性通过指定行框与哪个点 ...

  3. 杭电1142(最短路径+dfs)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  4. hdu5772-String problem(最大权闭合子图问题)

    解析: 多校标答 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分)第二类:原串中的n个点每个点拆出一个点,第i个点权值为 –a[s[i]] ...

  5. poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)

    Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...

  6. (转)25个增强iOS应用程序性能的提示和技巧--高级篇

    高级当且仅当下面这些技巧能够解决问题的时候,才使用它们: 22.加速启动时间23.使用Autorelease Pool24.缓存图片 — 或者不缓存25.尽量避免Date格式化 高级性能提升 寻找一些 ...

  7. Spring项目的建立-移植流程(非入门教程)

    Creat by Zhou yong in 2016/4/15/19:00 jar包 java 1.7 tomcat的两个jar包 2个文件上传的jar包 json支持的jar包 hibernate- ...

  8. C#/.Net Post获取数据流的一种简单写法

    最近在弄一些第三方的平台,经常调用第三方的接口实现某些特定的功能 在实现的同时基本上都需要本地的数据经过服务器在Request到第三方的服务器中处理,再返回相应的数据结构体:json/xml 以下是我 ...

  9. html进阶css(4)

    盒子模型-边框 首先请看下图 <!doctype html> <html> <head> <meta charset="utf-8"> ...

  10. solr group分组查询

    如:http://localhost:8080/solr/test_core/select?q=*:*&wt=json&indent=true&group=true&g ...