51Nod_1134 最长递增子序列
http://www.51nod.com/Challenge/Problem.html#!#problemId=1134
题目
给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的);例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
输入
第1行:1个数N,N为序列的长度(2 <= N <= 50000);第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
输出
输出最长递增子序列的长度。
样例输入
8
5
1
6
8
2
4
5
10
样例输出
5
分析
使用O(nlogn)的算法。
C语言程序
#include<stdio.h>
#define N 50000
int a[N];
int len;
int BiSearch(int *a,int len,int w)
{
int left=0,right=len-1;
int mid;
while(left<=right){
mid=(left+right)/2;
if(a[mid]>w)
right=mid-1;
else if(a[mid]<w)
left=mid+1;
else
return mid; //找到了该元素,则直接返回
}
return left; //数组a中不存在该元素,则返回该元素应该插入的位置
}
int LIS(int *array,int n)
{
int i,pos=0;
len=1;
a[0]=array[0];
for(i=1;i<n;i++)
if(array[i]>a[len-1])
a[len++]=array[i];
else{
pos=BiSearch(a,len,array[i]); //二分查找需要插入的位置
a[pos]=array[i];
}
return len;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("%d\n",LIS(a,n));
return 0;
}
本文介绍了51Nod_1134最长递增子序列问题,通过一个C语言实现的示例,展示了如何采用O(nlogn)的时间复杂度来解决该问题。文章提供了完整的代码示例,并解释了如何使用二分查找来高效地确定递增子序列。

557

被折叠的 条评论
为什么被折叠?



