NYOJ214
单调递增子序列(二)
- 描述
-
给定一整型数列{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的更多相关文章
- 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 ...
- 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 ...
随机推荐
- Delphi中CoInitialize之探究
CoInitialize(LPVOID),它将以特定参数调用CoInitializeEx,为当前单元初始化COM库,并标记协同模式为单线程模式.参数必须为NULL.这是关于OLE和COM的问题. Co ...
- shell if
shell中if做比较 比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then 这里的关键有几点: 1 使用单个等号 ...
- Getting Started with the C# Driver
1.下载 如果下载的.zip文件,只需要解压即可. 如果安装的.msi文件,它会将C#驱动DLL放在C:\Program Files (x86)\MongoDB\CSharp Driver xxx的位 ...
- [C++]C++标准里 string和wstring
typedef basic_string<char> string; typedef basic_string<wchar_t> wstring; 前者string是常用类型, ...
- cookie与localstorage和sessionstorage的区别比较
保存位置: 三者均保存在浏览器端,且同源的. 与服务器的关系: cookie 数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递. sessionStorage ...
- C++陷阱之慎用string类
我们知道,string类为我们提供了很多的便利,我们用string类能方便的做字符串的各种操作,避免了我们直接操作char指针而产生的一些繁琐的操作,和内存泄露的可能性,可是string类也是有陷阱的 ...
- c# 中crystal report输出PDF文件
工程中引入以下crystal report的类库crystaldecisions.crystalreports.enginecrystaldecisions.reportsourcecrystalde ...
- Human Gene Functions
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...
- Poj(1469),二分图最大匹配
题目链接:http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- java提高篇---Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...