滑雪
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 16477 | Accepted: 5342 |
Description
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
Input
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
Output
输出最长区域的长度。
Sample Input
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Sample Output
25
Source
-------------------------------------------------------------------------------------------------------------------------------------------------
难度 2 代码量 2 分类:动态规划
分析:
经典的dp问题,某一座标的最长路径=这个坐标周围的坐标的最长路径的最大值+1,f(x,y)=max{f(x-1,y),f(x+1,y),f(x,y-1),f(x,y+1)}+1;f(x,y)=1,x,y是最低点。注意边界处理,而且为了保证低坐标的先计算,所以需要对坐标按高度排序。
#include
<
stdio.h
>
#include < stdlib.h >
#include < memory.h >
#define LEFT 0
#define RIGHT 1
#define UP 2
#define DOWN 3
int mat[ 100 ][ 100 ] = ... {0} ;
int len[ 100 ][ 100 ] = ... {0} ;
typedef struct _node
... {
int x;
int y;
} Node;
Node quene[ 100 * 100 ];
int cmp( const void * a, const void * b)
... {
return (mat[((Node *) a)->x][((Node *)a)->y]-mat[((Node *)b)->x][((Node *)b)->y]);
}
void com( int x, int y, int dir)
... {
int px,py;
switch(dir)
...{
case LEFT:
px=x;
py=y-1;
break;
case RIGHT:
px=x;
py=y+1;
break;
case UP:
px=x-1;
py=y;
break;
case DOWN:
px=x+1;
py=y;
break;
}
if(mat[px][py]>mat[x][y]&&len[px][py]<=len[x][y])
...{
len[px][py]=len[x][y]+1;
}
}
int main()
... {
int i,j,n,m;
int max;
Node * np;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
...{
for(j=0;j<m;j++)
...{
scanf("%d",&(mat[i][j]));
quene[i*m+j].x=i;
quene[i*m+j].y=j;
}
}
qsort(quene,n*m,sizeof(Node),cmp);
for(np=quene;np<quene+n*m;np++)
...{
if(np->x!=0)
...{
com(np->x,np->y,UP);
}
if(np->x!=n-1)
...{
com(np->x,np->y,DOWN);
}
if(np->y!=0)
...{
com(np->x,np->y,LEFT);
}
if(np->y!=m-1)
...{
com(np->x,np->y,RIGHT);
}
}
max=0;
for(i=0;i<n;i++)
...{
for(j=0;j<m;j++)
...{
if(max<len[i][j])
max=len[i][j];
}
}
printf("%d",max+1);
return 0;
}
#include < stdlib.h >
#include < memory.h >
#define LEFT 0
#define RIGHT 1
#define UP 2
#define DOWN 3
int mat[ 100 ][ 100 ] = ... {0} ;
int len[ 100 ][ 100 ] = ... {0} ;
typedef struct _node
... {
int x;
int y;
} Node;
Node quene[ 100 * 100 ];
int cmp( const void * a, const void * b)
... {
return (mat[((Node *) a)->x][((Node *)a)->y]-mat[((Node *)b)->x][((Node *)b)->y]);
}
void com( int x, int y, int dir)
... {
int px,py;
switch(dir)
...{
case LEFT:
px=x;
py=y-1;
break;
case RIGHT:
px=x;
py=y+1;
break;
case UP:
px=x-1;
py=y;
break;
case DOWN:
px=x+1;
py=y;
break;
}
if(mat[px][py]>mat[x][y]&&len[px][py]<=len[x][y])
...{
len[px][py]=len[x][y]+1;
}
}
int main()
... {
int i,j,n,m;
int max;
Node * np;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
...{
for(j=0;j<m;j++)
...{
scanf("%d",&(mat[i][j]));
quene[i*m+j].x=i;
quene[i*m+j].y=j;
}
}
qsort(quene,n*m,sizeof(Node),cmp);
for(np=quene;np<quene+n*m;np++)
...{
if(np->x!=0)
...{
com(np->x,np->y,UP);
}
if(np->x!=n-1)
...{
com(np->x,np->y,DOWN);
}
if(np->y!=0)
...{
com(np->x,np->y,LEFT);
}
if(np->y!=m-1)
...{
com(np->x,np->y,RIGHT);
}
}
max=0;
for(i=0;i<n;i++)
...{
for(j=0;j<m;j++)
...{
if(max<len[i][j])
max=len[i][j];
}
}
printf("%d",max+1);
return 0;
}