本题求一个字符串中的最长递增子序列的长度。

动态规划方程

a[]记录字符串;

d[i]记录以第i个元素为最后一个元素的最长递增序列的长度

则 d[i+1]=1+max(d[j])  其中(j<i+1)并且a[j]<a[i+1]。

这样的话,没更新一个d[i+1],都需要搜索一遍前i项,因而此时复杂度为o(n^2)。

******* 疯狂的分割线 ********

这样的效率显然太低了。通常的想法是能不能借助二分查找优化复杂度至o(nlogn)。

而直接进行二分查找显然不现实(因为无序)

因此转换思路,设置一个数组s[]用于记录 :    s[k]为满足d[i]=k的最小的a[i]   。(天才的一步)

(关于这个s[k]还有一种解释方式,后面再说)

这样,s的下标实质上就保存了最长递增序列的长度,同时由于每访问一个新的a[i]就会尝试在s数组中插入该a[i],因而s[k]就始终是保持有序的。

啧,如果感觉上述解释不够清楚的话,另一种解释方式如下:

本质上一个长度为n的字符串的最大递增子序列的是有限的也就是 [1,n]。因此不妨采用多阶段决策的方式分别考虑每一种长度和他们的递增关系。

因此设置s[]数组来记录 :例如 记最大递增子序列长度为1的子序列的最后一个元素为s[1]; 记最大递增子序列长度为2的子序列的最后一个元素为s[2];s[k]同理。

这样只需遍历一遍a[]字符串,对其中的每一个字符都对s[]做一个更新维护:维护的原则对于a[i]是找到当前s[]中比a[i]小的最大数的后一个位置,该位置就是a[i]应插入的位置,因为该位置插入后可以保证s依然有序,同时所覆盖的原来的值也一定是比a[i]大的。

过程模拟如下:

对于a[]={1,2,4,3}

s初始状态为{-1,inf};

开始遍历a数组;

a[0]=1,二分查找后得到1应该插入s[1]位置;s状态变为{-1,1,inf},s[1]=1;(注意s的定义)

a[1]=2,二分插入后s状态变为(-1,1,2,inf),s[2]=2;

a[4]=4,二分插入后s状态变为{-1,1,2,4,inf},s[3]=4;

a[3]=3, 此时2<3<4,因此二分查找到的位置为当前4的位置,s状态变为{-1,1,2,3,inf},此时s[3]=3;

此时a数组遍历完成,s数组的最大长度为3,也就是所要求的结果。(s数组有一种贪心的意思在里面,每更新一次都保证其值是最小的尾数)

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn=+;
const int inf=;
int a[maxn];
int s[maxn];
int b_search(int *s,int x,int len){//左闭右开
int l=,r=len;
while(l<r){
int mid=l+(r-l)/;
if(s[mid]==x)return mid;
else if(x<s[mid]){
r=mid;
}
else if(x>s[mid]){
l=mid+;
}
}
return l;
}
int main(void){
int n;
cin>>n;
for(int i=;i<n;i++) {
scanf("%d",&a[i]);
}
s[]=-;
int len=;
for(int i=;i<n;i++){
s[len]=inf;
int j=b_search(s,a[i],len+);
if(j==len)len++;
s[j]=a[i];
}
int ans=len-;
cout<<ans<<endl;
return ;
}

POJ2533_Longest Ordered Subsequence (线性动态规划变形)的更多相关文章

  1. poj-2533 longest ordered subsequence(动态规划)

    Time limit2000 ms Memory limit65536 kB A numeric sequence of ai is ordered if a1 < a2 < ... &l ...

  2. (线性DP LIS)POJ2533 Longest Ordered Subsequence

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

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

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

  4. Project 4:Longest Ordered Subsequence

    Problem description A numeric sequence of ai is ordered if a1 < a2 < - < aN. Let the subseq ...

  5. 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence

    问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...

  6. poj 2533Longest Ordered Subsequence

    Longest Ordered Subsequence Description A numeric sequence of ai is ordered if a1 < a2 < - < ...

  7. POJ2533:Longest Ordered Subsequence

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

  8. POJ_2533 Longest Ordered Subsequence 【LIS】

    一.题目 Longest Ordered Subsequence 二.分析 动态规划里的经典问题.重在DP思维. 如果用最原始的DP思想做,状态转移方程为$DP[i] = max(DP[j] + 1) ...

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

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

随机推荐

  1. vux 局部注册组件

    在home.vue里面,引入Prop.vue组件: 其中 <child :message="msg"></child>的时候 是这么赋值的: data () ...

  2. video事件

    /** video播放器*/ * @ src: 指定所要嵌入视频.文档的URL. * @ poster: 视频预览图像 * @ autoplay: 视频自动播放 * @ loop: 循环播放 * @ ...

  3. JQuery 用法总结

    1.隐藏与显示,用于div等等 //隐藏id=myTab下的所有li标签 $("#myTab li").hide(); //动画隐藏,1秒内隐藏该对象 $(); //显示class ...

  4. SHTML 教程

    什么是 SHTML 使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为“服务器端嵌入”或者叫“服务器端包含”,是一种类 ...

  5. 线段树(成段更新,区间求和lazy操作 )

    hdu1556 Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. phpStorm 显示行号

  7. oracle的认证方式

    使用as sysdba是使用操作系统验证方式,不需要输入密码

  8. VM+CentOS+hadoop2.7搭建hadoop完全分布式集群

    写在前边的话: 最近找了一个云计算开发的工作,本以为来了会直接做一些敲代码,处理数据的活,没想到师父给了我一个课题“基于质量数据的大数据分析”,那么问题来了首先要做的就是搭建这样一个平台,毫无疑问,底 ...

  9. HDU_3183_A Magic Lamp

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  10. linux dd命令详解及使用案例场景

    一.dd命令 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. if ...