Antimonotonicity

来源:互联网 发布:淘宝达人发布完哪里查 编辑:程序博客网 时间:2024/05/01 02:26

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.

 

0 0
原创粉丝点击