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 ...
随机推荐
- 腾讯云CMQ消息队列在Windows环境下的使用
版权声明:本文由李少华原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/100 来源:腾云阁 https://www.qclo ...
- Android 测量调用方法耗时的方法
private long mDrawnRealTime; 起点:mDrawnRealTime = SystemClock.elapsedRealtime(); 终点: long delay = Sys ...
- nodejs 重定向 (redirect + writeHead(Location))
参考: Node.js实现301.302重定向服务 Express URL跳转(重定向)的实现:res.location()与res.redirect() 一 方式1 index.js var htt ...
- 【BZOJ2142】礼物 组合数+CRT
[BZOJ2142]礼物 Description 小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi.请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在 ...
- Android自动读取短信验证码
Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...
- android 仿微信聊天界面,以及语音录制功能
extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 ...
- Android软件开发之EditText 详解(八)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/65718 ...
- 香港主机Squid+Stunnel代理搭建
1.说明 Squid,代理软件 Stunnel,数据包加密(貌似如果数据不加密,客户端的数据流无法传到squid服务端,原因你懂的!) 2.Squid安装略 3.安装完squid后需要以下操作 a.生 ...
- Hadoop集群搭建文档
环境: Win7系统装虚拟机虚拟机VMware-workstation-full-9.0.0-812388.exe Linux系统Ubuntu12.0.4 JDK j ...
- 学习认识Spring原理
学习认识Spring原理 Spring 是一种业务层框架.搭建Spring框架需要Spring开发包和commons-logging包.Spring的核心思想是控制反转也称依赖注入(创建者--(实例) ...