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

动态规划方程

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. JS-比较函数中嵌套函数,可以排序【对象数组】

    function createCompareFun(propertyName){ return function(object1,object2){ var value1 = object1[prop ...

  2. LeetCode——Reverse Linked List

    反转链表,用了一个比较笨的方法. public class Solution { public ListNode reverseList(ListNode head) { if(head == nul ...

  3. mysql导入数据失败:mysql max_allowed_packet 设置过小

    mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...

  4. Oracle预定义的21个系统异常类型

    命名的系统异常 产生原因 ACCESS_INTO_NULL 未定义对象 CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 COLLECTION_IS_N ...

  5. 写一个体验良好的git commit

    一直在使用git也看过格式各样commit log , review 代码时最刺激的是看到这类 "." 应付差事,还有 "fix bug","fix& ...

  6. Cisco配置发送日志到日志服务器

    Cisco配置发送日志到日志服务器logging 172.16.6.22logging onlogging trap 7  //指定日志消息的级别 (0:紧急(Emergencies) 1:告警(Al ...

  7. Google Now 'not available in your country'

    Google Now 'not available in your country' Don't know how to cope with this problem.

  8. CVP沙龙

    关于职场: 35岁之后,还去招聘网站投简历? 35岁可能是个分水岭 95后比一些80后还强, 有些80后玻璃心 35岁有的可能已经是VP了 应该深入积累而不是蜻蜓点水 只有第一年成长了,之后是重复劳动 ...

  9. Python开发【笔记】:sort排序大法

    浅谈排序 程序中经常用到排序函数,Python 提供了 sort 和 sorted 函数,一个原地排序,一个返回排序后的新结果 1.参数 函数原型: sort([cmp[, key[, reverse ...

  10. mysql 约束条件介绍

     mysql 约束条件介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FO ...