博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长严格上升子序列
阅读量:5951 次
发布时间:2019-06-19

本文共 1281 字,大约阅读时间需要 4 分钟。

该题应使用动归
 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 黄金 Gold
 查看运行结果
 
 
题目描述 
Description

给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. <abk,其中b1<b2<..bk。

输出长度即可。

输入描述 
Input Description

第一行,一个整数N。

第二行 ,N个整数(N < = 5000)

输出描述 
Output Description

输出K的极大值,即最长不下降子序列的长度

样例输入 
Sample Input

5

9 3 6 2 7

样例输出 
Sample Output

3

数据范围及提示 
Data Size & Hint

【样例解释】

最长不下降子序列为3,6,7

#include
int n,a;int s[1000001],v[1000001];int main(){ scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&s[i]); v[++a]=s[1]; for(int i=1; i<=n; i++) { if(v[a]

 

解释例子    1 3 7 9 4 5 6 10共这些数若后面的数大于前面的数,那么我们把a[i]存到v[a]数组中,这样v数组的下标可以代替最长序列长度。若后面的数大于前面的数,那么我们用一个for循环找到第一个比这个数大的数,替换。同时,我们可以发现a的大小并没有发生改变。即开始时最长序列为 1 3  7 9把7 9 改成4 5后继续进行以上的内容。

  nlongn做法

#include
using namespace std;int n,f[5001],s,x;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); if(x>f[s]) { f[++s]=x; continue; } int l=0,r=s,k; while(l<=r) { int m=l+r>>1; if(x>f[m]) { l=m+1; k=m; } else r=m-1; } if(f[k+1]>x) f[k+1]=x; } printf("%d",s);}

 

转载于:https://www.cnblogs.com/z360/p/6361758.html

你可能感兴趣的文章
CentOS GRUB引导错误无法进入系统解决办法
查看>>
我的友情链接
查看>>
利用saltstack的api接口和modules实现实时监控
查看>>
sybase_isql命令
查看>>
kernel.sem信号量参数调优,以及ipcs信号量队列查询
查看>>
理解嵌入式开发中的一些硬件相关的概念
查看>>
ceph的读写性能测试
查看>>
access_token is invalid or not latest hint
查看>>
H3C设备之 EASY NAT
查看>>
Linux常用命令参考手册02
查看>>
linux 编写shell管理脚本01。2
查看>>
Emmet 文档下载,所有快捷键总结
查看>>
通过EmbeddedServletContainerCustomizer接口调优Tomcat
查看>>
hdu2000——ASCII码排序
查看>>
spring配置线程池
查看>>
Ubuntu 16.04 安裝chrome
查看>>
开发了个 Flipper 调试工具的 Flutter 版本 SDK,让 Flutter 应用调试起来更容易
查看>>
08.实例方法和类方法的区别与及工厂方法
查看>>
mysql 备份
查看>>
内核编译
查看>>