openjudge 百练 2757:最长上升子序列

总时间限制: 
2000ms

内存限制: 
65536kB
描述
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1a2, ..., aN),我们可以得到一些上升的子序列(ai1ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

输入
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
输出
最长上升子序列的长度。
样例输入
7
1 7 3 5 9 4 8
样例输出
4
 /*再做做这道题是因为另一道题目是反利用这个c数组的,这里复习一下*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
int n;
#define N 1010
int c[N],f[N],ans=-N,a[N];
int search(int l,int r,int k)
{
if(l==r) return l;
int mid=(l+r+)>>;/*还有这里的+1*/
if(c[mid]>=k) return search(l,mid-,k);/*这里的mid-1是保证是上升序列*/
else return search(mid,r,k);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
memset(f,,sizeof(f));
memset(c,,sizeof(c));
for(int i=;i<=n;++i)
{
f[i]=search(,i,a[i])+;/*这里的具体二分过程最好自己手动模拟一下,以防出错*/
c[f[i]]=min(a[i],c[f[i]]);
ans=max(f[i],ans);
}
printf("%d\n",ans);
return ;
}

最新文章

  1. Python基础s14-day1
  2. H5 浏览器开发文档
  3. 第五百八十三天 how can I 坚持
  4. MongoDB空间整理
  5. Linux 链接(转载)
  6. 简述configure、pkg-config、pkg_config_path三者的关系
  7. DevExpress的JavaScript脚本智能提示
  8. python算法(一)
  9. 运行mvn install时跳过Test
  10. JSP第六篇【自定义标签之传统标签】
  11. vue项目安装vux
  12. Flask简单学习
  13. python_打包成exe
  14. Unicode编码学习
  15. unity3d-游戏实战突出重围,整合游戏
  16. Task Class
  17. Webstorm使用教程详解
  18. position:absolute元素 怎样居中
  19. selenium测试报告(含通过率统计图和失败截图)
  20. GO1.6语言学习笔记2-安装配置及代码组织

热门文章

  1. 深入理解Spring系列之四:BeanDefinition装载前奏曲
  2. 33 - 并发编程-线程同步-Event-lock
  3. [Leetcode] Sum 系列
  4. python基础===15条变量&amp;方法命名的最佳实践
  5. oracle相关命令收集-张
  6. Python+Selenium 自动化实现实例-数据驱动实例
  7. LeetCode解题报告—— Best Time to Buy and Sell Stock
  8. Git分支管理小结
  9. Windows内核读书笔记——SEH结构化异常处理
  10. MINIBASE源代码阅读笔记之DB