单调递增子序列(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述

给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

 
输入
有多组测试数据(<=7)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
输出
对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
这个与单调递增子序列(一)有些不同,
(一)
在单调递增子序列一中,可以用一个数组保存当前位置之前的最大子序列长度,可以在一次遍历数组串,每次查询之前的数组小于当前数的最大值,这样的
时间复杂度就是0 + 1 + 2 + ... + n-1 = (n-1)*n/2 即O(n2)
例如输入:【2,3,1,2,3】
结果数组:【1,0,0,0,0】
     【1,2,0,0,0】
     【1,2,1,0,0】
     【1,2,1,2,0】
     【1,2,1,2,3】
结果是3
(二)的话可以用一个数组记录当前最大字符串长度,判断当前数与数组顶部的值大小,(1)如果大于数组顶的数则直接添加到尾部,数组长度加1
                                       (2)在数组中找到一个数,这个数是大于等于当前数的最小的
                                          (可以用二分法时间复杂度O(nlogn))
比如输入【2,3,1,2,3】
数组变化:
【2】
【2,3】
【1,3】
【1,2】
【1,2,3】
不过这个方法只能求出最大递增子序列长度
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
int riseSubString(int a[], int n)
{
int i,l,r,m,s[],top = ;
if (n == )
return ;
s[] = a[];
for (i=; i < n; i++)
{
if (s[top] < a[i])
s[++top] = a[i];
else
{
l = ;
r = top;
m = top / ;
while ((l + ) < r) //二分,l与r间隔1时结束循环,再判断哪个是大于a[i]最小值
{
if (a[i] <= s[m])
{
r = m;
m = (r+l)/;
}
else
{
l = m;
m = (l+r)/;
}
}
if (s[l] > a[i])
s[l] = a[i];
else
s[r] = a[i];
}
}
return top + ;
}
int main()
{
int a[];
int n,i;
while (scanf("%d",&n) != -){
for (i=; i < n; i++)
scanf("%d",&a[i]);
printf("%d\n",riseSubString(a,n));
}
return ;
}

NYOJ214的更多相关文章

  1. NYOJ-214 单调递增子序列(二) AC 分类: NYOJ 2014-01-31 08:06 233人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> int len, n, i, j; int d[100005], a[100005]; int bin ...

  2. NYOJ-214 单调递增子序列(二) TLE 分类: NYOJ 2014-01-28 22:57 171人阅读 评论(0) 收藏

    #include<stdio.h> #include<stdlib.h> #define max(x,y) x>y?x:y #define MAXX 100005 int ...

随机推荐

  1. Zabbix中使用ICMP ping来判断主机是否存活的问题

    上一节配置了Simple check,现在来通过Simple check 用ICMP ping来监控充节点运行情况.Zabbix使用fping处理ICMP ping的请求,需要安装fping程序,安装 ...

  2. 表数据文件DBF的读取和写入操作

    import sys import csv import struct import datetime import decimal import itertools from cStringIO i ...

  3. rsync的断点续传设置。

    关于rsync的断点续传 关于rsync的断点续传 经常copy大文件,由于服务器.路由等网络的不确定性,老是出现 remote server not responding.于是查了下资料,发现rsy ...

  4. php中urlencode与rawurlencode的区别有那些呢

    urlencode 函数: 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+).此编码与 WWW 表单 POST 数据的编码 ...

  5. ASP.NET数据验证控件的常用的属性

    一.非空验证     RequiredFieldValidator ControlToValidate 所验证的控件ID Text 出错时的提示的文本 ErrorMessage 提交给Validati ...

  6. 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

    阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...

  7. SQL语句,给自己的记录

    1.group by 和求和函数的使用 select className,SUM(num) as sumNum FROM test GROUP BY className 2.更新一个字段的所有值 up ...

  8. 多校赛3- Solve this interesting problem 分类: 比赛 2015-07-29 21:01 8人阅读 评论(0) 收藏

    H - Solve this interesting problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I ...

  9. Java学习之路(三)

    1:面向对象

  10. Oracle插入时间

    现象:Oracle 插入时间时 ,报错:ORA-01861: 文字与格式字符串不匹配 解决方法: 这个错误一般出现在时间字段上,即你插入的时间格式和数据库现有的时间格式不一致,解决的方法是格式化你 插 ...