Description
给你1-N的一个排列,数列中的数字互不相等,要求找出最长的子序列a,满足a1 > a2,a2 < a3,a3 >a4,a4 < a5……
Input
T 代表T组数据 T<=50
每组数据一行: n 代表给你n个数,然后就是n个数 N<=30000
Output
T行每行一个数:
对于每组数据输出最长子序列的长度
Sample Input
4
5 1 2 3 4 5
5 5 4 3 2 1
5 5 1 4 2 3
5 2 4 1 3 5
Sample Output
1
2
5
3
分析:用一个数组来记录。
遇到一个数,要不比数组最后一项大,要不比它小。我们需要一个比它大的,来了一个比它大的,就长度加一,记录进去。如果比它小,就覆盖它,因为比它小,所以一定比前面的数要更优。放过了亦一样。
var
a,f:Array[1..30020] of longint;
n,i,j,ans:longint;
procedure main;
vari:longint;
begin
ans:=1;
f[1]:=a[1];
fori:=2 to n do
begin
if(ans+1) and 1=1 then
begin
ifa[i]>f[ans] then
begin inc(ans); f[ans]:=a[i]; end
elsef[ans]:=a[i];
end
else
begin
ifa[i]<f[ans] then
begin inc(ans);f[ans]:=a[i]; end
elsef[ans]:=a[i];
end;
end;
writeln(ans);
end;
procedure init;
vari,t,j:longint;
begin
readln(t);
fori:=1 to t do
begin
read(n);
fillchar(f,sizeof(f),0);
forj:=1 to n do
read(a[j]);
main;
end;
end;
begin
init;
end.