#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int res[40005] ; //保存非线性递增队列的结果
int n, resLen ;
void Insert (int low, int high, int val)
{
int mid ;
while (low <= high)
{
mid = (low+high) / 2 ;
if (res[mid] <= val)
low = mid + 1 ;
else
high = mid - 1;
}
res[low] = val ;
}
int main ()
{
int i, tcase, val;
scanf ("%d", &tcase) ;
while (tcase --)
{
resLen = -1 ;
scanf ("%d", &n) ;
for (i = 0; i < n; i ++)
{
scanf ("%d", &val) ;
if (resLen == -1) //如果数组元素为空,将当前值入数组
{
resLen ++ ;
res[resLen] = val ;
continue ;
}
else
{
if (val > res[resLen]) //如果当前值大于数组的栈顶元素,
{ //直接入数组,长度加1
resLen ++ ;
res[resLen] = val ;
continue ;
}
else if (val == res[resLen]) //如果出现相等
continue ;
else //否则替换掉当前数组中比当前值大的元素
Insert (0, resLen, val) ; //二分
}
}
cout << resLen+1 << endl ;
}
return 0 ;
}
PKU 1631 Bridging signals 二分查找
最新推荐文章于 2014-10-07 21:28:12 发布
本文介绍了一种使用二分查找优化的最长上升子序列(LIS)算法实现,通过非线性递增队列的方式求解输入序列的LIS长度。该算法首先初始化一个空的数组用于保存LIS,并通过循环迭代和条件判断更新数组内容,最终输出LIS的长度。
6万+

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



