滑雪
【题目描述】
Michael正在滑雪,为了获得速度,滑的区域必须向下倾斜,询问给定区域中最长的底滑坡是多少。
给定区域是一个二维数组,每个数字表示该点的高度,例如:
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
当且仅当高度减小时,Michael可以从某个点滑向上下左右相邻的四个点之一。在上面的例子中,一条可滑行的滑坡为24-17-16-1,25-24-23-······-3-2-1是最长的一条滑坡。
【输入描述】
第一行输入两个整数R、C(1 <= R,C <= 100),表示区域行数及列数;
接下来R行,每行输入C个整数,表示该点的高度H(0 <= H <= 10000)。
【输出描述】
输出一个数,表示最长滑坡的长度。
【输入样例】
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<cstdio> int m,n,ans(0),i[101][101],f[101][101]={0}; int DFS(int x,int y) //记忆化搜索。 { if (f[x][y]) //若已被搜索过,则返回其值。 return f[x][y]; int num=1; //其本身。 if (x<n&&i[x][y]>i[x+1][y]) //注意限制边界。 { int t=DFS(x+1,y)+1; //比较大小,注意其本身。 if (t>num) num=t; } if (x>1&&i[x][y]>i[x-1][y]) { int t=DFS(x-1,y)+1; if (t>num) num=t; } if (y<m&&i[x][y]>i[x][y+1]) { int t=DFS(x,y+1)+1; if (t>num) num=t; } if (y>1&&i[x][y]>i[x][y-1]) { int t=DFS(x,y-1)+1; if (t>num) num=t; } return f[x][y]=num; //回溯并顺便进行赋值。 } int main() { scanf("%d%d",&n,&m); for (int a=1;a<=n;a++) for (int b=1;b<=m;b++) scanf("%d",&i[a][b]); for (int a=1;a<=n;a++) for (int b=1;b<=n;b++) { f[a][b]=DFS(a,b); if (f[a][b]>ans) ans=f[a][b]; } printf("%d",ans); return 0; }