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

动态规划方程

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. JavaBean入门及简单的例子

    不会编写JavaBean就不是一个Java开发人员. 那么,何谓JavaBean呢? JavaBean是符合某种规范的Java组件,也就是Java类. 它必须满足如下规范: 1)必须有一个零参数的默认 ...

  2. HDU 4455 Substrings[多重dp]

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. Weinre 远程调试移动端手机web页面

    调试场景 1.调试页面在手机上.2.调试工具在PC的chrome3.手机跟pc要在同一个网络环境下,也就是都使用一个wifi 一.安装 Weinre 1.Weinre是基于nodejs实现的,所以使用 ...

  4. Feature Tools 简介

    FeatureTools是2017年9月上线的github项目,是一个自动生成特征的工具,应用于关系型数据. github链接:https://github.com/Featuretools/feat ...

  5. Jenkins升级、迁移、备份

    1.升级 下载新版Jenkins.war文件,替换旧版本war文件,重启即可. Jenkins.war文件的位置一般为/usr/lib/jenkins/Jenkins.war. 2.迁移.备份 Jen ...

  6. Oracle下where子句

    课外题 要求:删除某一个用户,同时保留该用户的数据?如何解决 alter user scott account lock :改天需要使用则解锁unlock 锁定用户使用sysdba登录还是可以查看数据 ...

  7. With all Java versions it is strongly recommended to not use experimental -XX JVM options.

    https://lucene.apache.org/solr/7_6_0//SYSTEM_REQUIREMENTS.html System Requirements Apache Solr runs ...

  8. pandas 取消读取csv时默认第一行为列名

    读取时默认第一行为列名 此时DataFrame的列名为第一行数据: 因为第一行为有效数据,故不可作为列名,要么重新起列名,要么使用默认序列列名: 取消默认第一行为列名 给 pd.read_csv() ...

  9. 利用CombineFileInputFormat把netflix data set 导入到Hbase里

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xiewenbo/article/details/25637931 package com.mr.te ...

  10. 205-react SyntheticEvent 事件

    参看地址:https://reactjs.org/docs/events.html