HDU 5773 最长上升子序列
题意 给出一个序列 问它的最长严格上升子序列多长 这个序列中的0可以被替代为任何数
n的范围给出了1e5 所以平常的O(n*n)lis不能用了
在kuangbin的模板里有O(nlogn)的模板 套上就可以过了
但是比赛的时候没有拿模板= =. 于是就想出了另外一个时间复杂度不明的办法= =.
将序列从前往后扫
设定一个数组a a[i]=z a[i]为当前i长度的上升子序列中的最小的尾数的大小 maxl为当前找出的最长的子序列长度
每次我们扫到一个数 都对0-maxl长度的a[i]进行判断 看能不能将他加到长度为i-1的序列的尾部 来优化a[i]使长度为i的序列的尾数更小
当遇到非0数的时候 只需要慢慢判断就好了 遇到0的时候 应当尽量的使0变换的数更小 则在优化的时候应当将0变为a[i-1]+1来与a[i]比较
最后的maxl即为答案
这个办法速度并不稳定 因为每次都要从0-maxl扫一遍 最差的时候是O(n*n)(当所给序列为上升序列时)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
using namespace std;
int n;
int a[100050]; /// every l - min wei
int maxl;
int main()
{
int t;
scanf("%d",&t);
int tt=0;
while(t--)
{
tt++;
maxl=0;
a[0]=-999999999;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x!=0)
{
if(x>a[maxl]){
maxl++;
a[maxl]=x;
}
for(int k=maxl;k>=2;k--)
{
if(x>a[k-1]&&x<a[k])
a[k]=x;
}
if(x<a[1])
a[1]=x;
}
else
{
maxl++;
a[maxl]=a[maxl-1]+1;
for(int k=maxl-1;k>=1;k--)
{
if(a[k]>a[k-1]+1)
a[k]=a[k-1]+1;
}
}
}
printf("Case #%d: ",tt);
printf("%d\n",maxl);
}
}
HDU 5773 最长上升子序列的更多相关文章
- hdu  5773   最长递增子序列 (nlogn)+贪心
		
The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
 - hdu 1950 最长上升子序列(lis) nlogn算法【dp】
		
这个博客说的已经很好了.http://blog.csdn.net/shuangde800/article/details/7474903 简单记录一下自己学的: 问题就是求一个数列最长上升子序列的长度 ...
 - hdu 1950 最长上升子序列
		
//Accepted 3540 KB 62 ms //dp 最长上升子序列 #include <cstdio> #include <cstring> #include < ...
 - HDU 5748 最长上升子序列的长度nlogn(固定尾部)
		
Bellovin Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
 - HDU 1025(最长上升子序列)
		
题意是要在两条平行线间连点,要在线不交叉的前提下尽可能多的连线,问最多能连多少条线. 现假定题中所给的是 9 组点,分别是:1—3,2—8,3—5,4—9,5—2,6—4,7—6,8—7,9—1,如图 ...
 - HDU 1159 最长公共子序列(n*m)
		
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
 - HDU 1159 最长公共子序列
		
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
 - HDU - 1503 最长公共子序列记录路径
		
题意:先给两个水果的名字然后得出一个最短的序列包含这两个词. 思路:我一开始的思路是先求出最长公共子序列,然后做一些处理将其他的部分输出来:两种水果的字符串和最长公共子序列的字符串这三个字符串做对比, ...
 - HDU - 1160 最长上升子序列以及记录路径
		
题意:第一列,给出老鼠的重量,第二列,给出老鼠的速度,要证明老鼠的重量越大,速度越小,给出最多老鼠的数量,并说明第几只. 思路:先将老鼠按照重量从大到小排序,然后速度是从小到大,求最长上升子序列,学习 ...
 
随机推荐
- July 21st, Week 30th Thursday, 2016
			
What youth deemed crystal, age finds out was dew. 年少时的水晶,在岁月看来不过是露珠. As time goes by, we are gradual ...
 - opencv学习笔记(七)SVM+HOG
			
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
 - Java Hour3
			
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为2 Hour,请各位不吝赐教. Hour3 包和i ...
 - loj 1154(最大流+枚举汇点)
			
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26868 思路:拆点,容量为最多能跳的步数,然后设立一个超级源点,源 ...
 - 个人电脑配置FTP服务器,四张图搞定。项目需要,并自己写了个客户端实现下载和上传的功能!
			
测试结果:
 - diff和common
			
diff 命令 diff命令:找出两个文件的不同点,用于比较文件的差异 linux上非常重要的工具,一般用于制作补丁文件,特别是比较两个版本不同的文件以找到改动的地方. diff在命令行中打印每一个行 ...
 - js:语言精髓笔记10--闭包
			
闭包: //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...
 - Xamarin Visual  Studio提示找不到AssemblyAttributes.cs文件
			
Xamarin Visual Studio提示找不到AssemblyAttributes.cs文件 错误信息:Could not find file ‘C:\Users\[用户名]\AppDat ...
 - c# 使用正则表达式 提取章节小说正文全本篇
			
这一节主要内容是使用正则表达式提取网站的正文,主要面向于小说章节网站.其中涉及到一些其他知识点,比如异步读取.异步流写入等,代码中都会有详细的注解.现在流行的网络文学都是每日一更或几更,没有一个统一的 ...
 - http://blog.csdn.net/shangboerds/article/details/44175667
			
http://blog.csdn.net/shangboerds/article/details/44175667