04_最长上升子序列问题(LIS)
来源:刘汝佳《算法竞赛入门经典--训练指南》 P60 问题6:
问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他的数顺序不变)。比如,从序列1,6,2,3,7,5中,可以选上升子序列1,2,3,5,也可以选出1,6,7;但前者更长。选出的相邻元素不能相等。
O(n^2)的时间复杂度思路分析:设d[i]为以i结尾的最长上升子序列的长度,则d[i]=Max{0,d[j](满足j<i,aj<a[i])}+1。最终的答案为Max{d[i]}。
(若LIS中的相邻元素可以相等,把“<”改为“<=”即可)。
O(nlog(n))的时间复杂度思路分析:假设经过计算出的两个状态i和j满足ai<aj && d[i]==d[j];则只需要保存ai状态即可(对于后续状态k来说,若ak>ai,则ak一定大于aj,反之则不一定)。我们可以用g[i]表示当前状态(从第一个数开始)下子序列长度为i的最小数,则每考虑后续的数加入的时候,更新g[]即可(二分查找)。(Tips:该思路只适合求最大长度问题)
例题来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=17
例题:nyoj 17
单调递增最长子序列
- 描述
- 求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
- 输入
- 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 - 输出
- 输出字符串的最长递增子序列的长度
- 样例输入
-
3
aaa
ababc
abklmncdefg - 样例输出
-
1
3
7
O(n^2)时间复杂度代码:
#include "stdio.h"
#include "string.h" #define N 10100 int d[N];
char str[N]; int inline Max(int a,int b) { return a>b?a:b; } int main()
{
int T;
int i,j;
int len;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
len = strlen(str);
int ans = ;
for(i=; i<len; ++i)
{
d[i] = ;
for(j=; j<i; j++)
{
if(str[i]>str[j])
d[i] = Max(d[i],d[j]+);
}
ans = ans>d[i]?ans:d[i];
}
printf("%d\n",ans);
}
return ;
}
O(nlog(n))的时间复杂度代码:
#include "stdio.h"
#include "string.h"
#define N 10005
#define INF 0x3fffffff int num; //num记录当前序列中,最长子序列的长度
int g[N]; //g[i]保存当前序列中,长度为i的上升子序列的最小字符
char str[N]; int er_fen(int l,int r,int k) //二分查找,返回值为数组g[]中小于k的最右边的数的下标
{
int mid;
if(k>g[r]) return r; //都比k小,返回r
if(k<=g[l]) return ; //都比k大,返回0
while(l+!=r)
{
mid = (l+r)/;
if(g[mid] < k)
l = mid;
else
r = mid;
}
return l;
} int main()
{
int T;
int i,k,len;
scanf("%d",&T);
getchar();
while(T--)
{
scanf("%s",str);
len = strlen(str);
for(i=,num=; i<len; i++)
g[i] = INF;
num = ;
g[] = str[];
for(i=; i<len; i++)
{
k = er_fen(,num,(int)str[i]);
if(g[k+] > str[i])
g[k+] = str[i];
if(k==num)
num++;
}
printf("%d\n",num); }
return ;
}
;
04_最长上升子序列问题(LIS)的更多相关文章
- 浅谈最长上升子序列(LIS)
一.瞎扯的内容 给一个长度为n的序列,求它的最长上升子序列(LIS) 简单的dp n=read(); ;i<=n;i++) a[i]=read(); ;i<=n;i++) ;j<i; ...
- 最长递增子序列(LIS)(转)
最长递增子序列(LIS) 本博文转自作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathinking.com) --- 最长递增子序列又叫做最长上升子序列 ...
- DP——最长上升子序列(LIS)
DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...
- [51Nod 1218] 最长递增子序列 V2 (LIS)
传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...
- 最长上升子序列(LIS)nlogn模板
参考https://www.cnblogs.com/yuelian/p/8745807.html 注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound 比如123458 ...
- 低价购买 (动态规划,变种最长下降子序列(LIS))
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 最长上升子序列(LIS)问题
最长上升子序列(LIS)问题 此处我们只讨论严格单调递增的子序列求法. 前面O(n2)的算法我们省略掉,直接进入O(nlgn)算法. 方法一:dp + 树状数组 定义dp[i]:末尾数字是i时最长上升 ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
随机推荐
- AEAI HR V1.5.1升级说明,开源人力资源管理系统
本次发版的AEAI HR_v1.5.1版本为AEAI HR_v1.5.0版本的升级版本,该产品现已开源并上传至开源社区http://www.oschina.net/p/aeaihr. 1 升级说明 A ...
- 关于c++数的进制的经验
默认状态下,数据按十进制输入输出.如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制. 注意: 1.使用不带.h的头文件& ...
- SQL 日期转换(阳历转阴历)
--步骤:创建日期表,放初始放初始化资料 --因为农历的日,是由天文学家推算出来,到现在只有到年,以后的有了还可以加入! if object_id('SolarData') is not nulldr ...
- 根据Expander的IsExpanded属性值的变化动态设计Control的size
简要说明: 当Expander 的IsExpanded属性为“True” 时给控件设个尺寸(此处为高度),当为“False”时给控件设另外一个值. 知识点:数据绑定.Style和Trigger < ...
- ToDoList:一款非常优秀的任务管理软件 —— 工具类
ToDoList是一款非常优秀的任务管理软件,用户可以方便地组织和安排计划.这是一个开源的项目,很多细节都考虑到了,推荐大家使用~ ToDoList 帮你把要做的事情列出来,一项一项,类似思维导图. ...
- redis配置注意事项
最近在看redis方面的官方文档,redis-server的相关配置建议如下: 1.vm.overcommit_memory = 1 2.禁用linux内核特性transparent huge pag ...
- PHP程序z中xdebug工具简要使用方法
PHP程序的debug PHP程序的debug,无论是cli方式还是web方式,都需要使用第三方的debug工具.PHP5.6之前,本身自带的debug功能,仅限于日志输出. 推荐使用免费xdebug ...
- 编写运行R脚本
1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),... ...
- 再谈visibility:hidden和display:none
之前写过一篇有关visibility:hidden和display:none的文章:为什么要用用visibility:hidden;代替display:none;?主要是从浏览器性能方面入手,却没写两 ...
- SQL对字符串数组的处理
一,用临时表作为数组 复制代码代码如下: create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(co ...