1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include<stdio.h> int map[105][105]={0}; struct node{ int x,y,h; }; struct node one[10005]={0}; int dx[5]={0,0,0,1,-1}, dy[5]={0,1,-1,0,0}; void qqsort(int l,int r){ int i,j,mid; struct node t; i=l;j=r;mid=one[(i+j)/2].h; do{ while(one[i].h>mid)i++; while(one[j].h<mid)j--; if(i<=j){ t=one[i]; one[i]=one[j]; one[j]=t; i++; j--; } }while(i<=j); if(i<r)qqsort(i,r); if(l<j)qqsort(l,j); }
int main(){ int n,m,i,j,k=1,max=0,hi,hj,ix,iy,jx,jy; int f[105][105]={0}; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++){ scanf("%d",&map[i][j]); one[k].x=i; one[k].y=j; one[k].h=map[i][j]; k++; } qqsort(1,n*m); for(i=1;i<=n*m;i++){ ix=one[i].x; iy=one[i].y; f[ix][iy]=1; for(j=1;j<=4;j++){ jx=ix+dx[j]; jy=iy+dy[j]; hi=map[ix][iy]; hj=map[jx][jy]; if(f[ix][iy]<f[jx][jy]+1&&hi<hj)f[ix][iy]=f[jx][jy]+1; } if(f[ix][iy]>max)max=f[ix][iy]; } printf("%d",max); return 0; }
|