【动态规划】滑雪

SHOI2002滑雪

滑雪一看就想到不上升链的动规,而转移方向是相邻的四个点,而只需要从大到小DP一遍就行了。O(4nm)

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;
}