trs喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
输入格式
输入文件
第1行: 两个数字r,c(1<=r,c<=100),表示矩阵的行列。
第2..r+1行:每行c个数,表示这个矩阵。
第1行: 两个数字r,c(1<=r,c<=100),表示矩阵的行列。
第2..r+1行:每行c个数,表示这个矩阵。
输出格式
输出文件
仅一行: 输出1个整数,表示可以滑行的最大长度。
仅一行: 输出1个整数,表示可以滑行的最大长度。
测试样例1
输入
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
输出
25题目大致就是这样。
一道记忆化搜索题。
贴代码:
#include <stdio.h>
#include <limits.h>
#include <string.h>
inline int max(const int x,const int y)
{
return x>y?x:y;
}
int map[100][100],f[100][100],r,c;
const int ci[4]={1,0,-1,0};
const int cj[4]={0,1,0,-1};
void dfs(int x,int y)
{
for (int i=0;i<4;++i)
{
int xx=x+ci[i],yy=y+cj[i];
if (xx<r && xx>-1 && yy>-1 && yy<c && map[xx][yy]<map[x][y])
{
if (!f[xx][yy])
{
f[xx][yy]=1;
dfs(xx,yy);
}
f[x][y]=max(f[xx][yy]+1,f[x][y]);
}
}
}
int main()
{
scanf("%d%d",&r,&c);
int maxx=INT_MIN,ii=0,jj=0;
for (int i=0;i<r;++i)
for (int j=0;j<c;++j)
scanf("%d",&map[i][j]);
for (int i=0;i<r;++i)
for (int j=0;j<c;++j)
{
f[i][j]=max(1,f[i][j]);
dfs(i,j);
}
maxx=INT_MIN;
for (int i=0;i<r;++i)
{
for (int j=0;j<c;++j)
{
// printf("%d ",f[i][j]);
if (maxx<f[i][j])
maxx=f[i][j];
}
// printf("\n");
}
printf("%d\n",maxx);
return 0;
}
大致思路就是每一个点作为起点都DFS一次。f[i][j]表示 i,j这个点作为起点的时候最多能有多少距离。