题意:就是求最长上升子序列.

分析:N^2DP会超时,用NlogN的算法.

code:

var   a:array[0..40001] of longint;
      datanum,d,n,i,p,top,num:longint;

      procedure find(key,l,r:longint);
      var   mid:longint;
      begin
            if l=r then
            begin p:=l; exit; end;
            mid:=(l+r)>>1;
            if a[mid]>key then find(key,l,mid)
            else find(key,mid+1,r);
      end;

begin
      readln(datanum);
      for d:=1 to datanum do
      begin
            fillchar(a,sizeof(a),0);
            readln(n);
            readln(num);
            a[1]:=num;
            top:=1;
            for i:=2 to n do
            begin
                  readln(num);
                  if num>a[top] then
                     begin inc(top); a[top]:=num; end
                  else
                     begin
                           find(num,1,top);
                           a[p]:=num;
                     end;
            end;
            writeln(top);
      end;
end.

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-11-01
  • 2022-12-23
  • 2021-12-26
  • 2021-08-01
  • 2022-12-23
  • 2021-12-03
相关资源
相似解决方案