单调递增子序列(二)

时间限制: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. 不同版本(2.3,2.4,2.5)的Servlet web.xml 头信息

    Servlet 2.3<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app    P ...

  2. Android如何区分app原生和webview实现

    在开发Android app时,特别是强内容展现型的功能,会想在原生native实现和web实现中做选择,做这种选择的时候,难免想看看竞品或其它app类似功能是用哪种方式实现的.但是如何判断其它app ...

  3. SDUT 2603:Rescue The Princess

    Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a b ...

  4. ==与equal在java中应用的感悟

    今天又算是长见识了.了解了下平时不注意的equal和==的区别. 不管是==又或是equal都是用来比较相同与否.当问题就在这里了,比较什么相同呢? 我的在日常的比较无非也就是两种:1.基本数据类型之 ...

  5. 20151221001 GridView 模板

    <asp:GridView ID="GridView1"                 runat="server" AllowPaging=" ...

  6. Pie(二分POJ3122)

    Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12985   Accepted: 4490   Special Ju ...

  7. A Knight's Journey 分类: POJ 搜索 2015-08-08 07:32 2人阅读 评论(0) 收藏

    A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35564 Accepted: 12119 ...

  8. mean函数

    求平均值 th> a=torch.zeros(,) [.0002s] th> a [torch.DoubleTensor of size 1x3] [.0003s] th> a[{, ...

  9. 窗体移动API

    //窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport ...

  10. nginx fastcgi 超时问题解决记录

    在网站后台导数据时,出现超时的情况.经过网上查找资料和试验 主要在下面几个配置的限制 1.php配置 第一种:set_time_limit(0); 永不过期 第二种: php.ini   max_ex ...