POJ2533_Longest Ordered Subsequence (线性动态规划变形)
本题求一个字符串中的最长递增子序列的长度。
动态规划方程
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 (线性动态规划变形)的更多相关文章
- poj-2533 longest ordered subsequence(动态规划)
Time limit2000 ms Memory limit65536 kB A numeric sequence of ai is ordered if a1 < a2 < ... &l ...
- (线性DP LIS)POJ2533 Longest Ordered Subsequence
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 66763 Acc ...
- poj 2533 Longest Ordered Subsequence 最长递增子序列
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098562.html 题目链接:poj 2533 Longest Ordered Subse ...
- Project 4:Longest Ordered Subsequence
Problem description A numeric sequence of ai is ordered if a1 < a2 < - < aN. Let the subseq ...
- 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence
问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...
- poj 2533Longest Ordered Subsequence
Longest Ordered Subsequence Description A numeric sequence of ai is ordered if a1 < a2 < - < ...
- POJ2533:Longest Ordered Subsequence
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 37454 Acc ...
- POJ_2533 Longest Ordered Subsequence 【LIS】
一.题目 Longest Ordered Subsequence 二.分析 动态规划里的经典问题.重在DP思维. 如果用最原始的DP思想做,状态转移方程为$DP[i] = max(DP[j] + 1) ...
- POJ 2533 Longest Ordered Subsequence(最长上升子序列(NlogN)
传送门 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subseque ...
随机推荐
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色 ...
- 在linux下安装Avria(小红伞)
1.下载AntiVir PersonalEdition Classic for linux http://www.free-av.com/ 2.解压: tar zxvf antivir.tar.gz ...
- Swift - 点击箭头旋转
let arrowImage = UIImageView(image: UIImage(named: "Machine_arrow")!.imageWithRenderingMod ...
- Hibernate数据类型映射
Hibernate映射类型分为两种:内置的映射类型和客户化映射类型.内置映射类型负责把一些常见的Java类型映射到相应的SQL类型:此外,Hibernate还允许用户实现UserType或Compos ...
- ionic+cordova开发!
这里是一些学习的过程中纪录的: 官方网站: http://www.ionic-china.com/ 参考文章: https://blog.csdn.net/xyzz609/article/detail ...
- PHP中文字数限制:中文字符串截取(mb_substr)
一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...
- LCA(离线算法)
hdu4547 CD操作 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- 循环赛日常表算法(N可为奇数和偶数)
一. 实验题目 设有n位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 二.实验目的 1.深刻理解并掌 ...
- C /C ++中结构体的定义
c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问 ...
- struts2的琐碎知识点
servlet:void init(ServletConfig cfg):// 读取servlet的配置参数void service(ServletRequest request, ServletRe ...