poj-1088滑雪

来源:互联网 发布:js 传数组到c 编辑:程序博客网 时间:2024/05/22 07:41

自来水~,按高度确定下搜索序,然后递推,记下当前最优值,O(RClog2(RC));
代码:

program poj_1088;const     dx:array[1..4] of longint=(-1,0,0,1);     dy:array[1..4] of longint=(0,-1,1,0);var   map,f:array[0..101,0..101] of longint;   x,y,h:array[1..10000] of longint;   R,C,Ans:longint;procedure swap(var a,b:longint);var   temp:longint;begin     temp:=a; a:=b; b:=temp;end;procedure qsort(l,r:longint);var   i,j,mid:longint;begin     i:=l; j:=r; mid:=h[(l+r) div 2];     repeat           while h[i]<mid do inc(i);           while h[j]>mid do dec(j);           if i<=j then begin              swap(x[i],x[j]);              swap(y[i],y[j]);              swap(h[i],h[j]);              inc(i); dec(j);           end;     until i>j;     if l<j then qsort(l,j);     if i<r then qsort(i,r);end;function max(a,b:longint):longint;begin     if a>b then exit(a) else exit(b);end;   procedure main;var   i,j,k,count:longint;begin     readln(R,C);          count:=0;     for i:=1 to R do begin         for j:=1 to C do begin             read(map[i,j]);             inc(count);             x[count]:=i;             y[count]:=j;             h[count]:=map[i,j];         end;         readln;     end;     qsort(1,count);     fillchar(f,sizeof(f),0);          Ans:=-maxlongint;     for i:=1 to count do begin         f[x[i],y[i]]:=1;         for k:=1 to 4 do             if (x[i]+dx[k]>=1)and(x[i]+dx[k]<=R)and(y[i]+dy[k]>=1)and(y[i]+dy[k]<=C) then                if map[x[i]+dx[k],y[i]+dy[k]]<map[x[i],y[i]] then                   f[x[i],y[i]]:=max(f[x[i],y[i]],f[x[i]+dx[k],y[i]+dy[k]]+1);         Ans:=max(Ans,f[x[i],y[i]]);     end;     write(Ans);end;begin     main;end.


原创粉丝点击