单调递增子序列(二)

时间限制: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. xhr dojo load

    require(["dojo/_base/xhr"], function(xhr) { // Execute a HTTP GET request xhr.get({ // The ...

  2. 测试过程中LR的关联报错

    在测试过程中,录制的脚本会做一些关联.在测试的过程中,常常出现关联失败的情况. 如果最后的结果有检查点,检查点失败而事务失败. 每次出现这样的情况,我都不知道如何办.为了不出现错误,我都在关联函数里面 ...

  3. post 405 method not allowed

    HTTP 405 错误 – 方法不被允许 (Method not allowed) 介绍 HTTP 协议定义一些方法,以指明为获取客户端(如您的浏览器或我们的 CheckUpDown 机器人)所指定的 ...

  4. oracle 存储过程发邮件

    CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT       VARCHAR2,                                      ...

  5. $IFS和set

    $IFS是内部字段分隔符的缩写.它决定Bash解析字符串时将怎样识别字段,或单词分界线.默认为(空格.制表符.换号) 修改$IFS: [xiluhua@vm-xiluhua][~/shell_scri ...

  6. oracle初次使用连接不上

    问题描述: win10下,cmd运行 输入sqlplus报一下错误 SP2-1503: 无法初始化 Oracle 调用界面 SP2-0152: ORACLE 不能正常工作 解决办法 cmd右键--以管 ...

  7. Oracle之主键的创建、添加、删除操作

    一.创建表的同时创建主键约束 1.1.无命名 SQL)); Table created SQL> select table_name,index_name from user_indexes w ...

  8. api(接口)文档管理工具

    api(接口)文档管理工具 欢迎光临:博之阅API管理平台  ,做为一个app开发者,还没有用到api管理工具,你就OUT了 点击进入:程序员精华博客大全  

  9. 30、springmvc

    第一章回顾JavaWeb中的MVC设计模式 1)MVC这种设计模式,不光运用于Web领域,而且也能用于非Web领域 2)今天说的MVC特指一种表现层设计模式,不限于Java语言 第二章回顾struts ...

  10. thinkphp模板中截取中文字符串的方法分享

    前段用thinkphp写了一个系统,感觉thinkphp学起来比较容易,开发起来了比较顺手,其中一个关键的因素就是它的模版引擎相当强大,使用方法跟smarty类似,在模版中还可以用php代码,有模版包 ...