BackGroud
今年冬天,到西岭雪山上滑雪的人越来越多。滑雪场的管理人员为了提高游客滑雪的兴趣,决定组织一场滑雪比赛。但他们在比赛地点的选择上出现了困难,因为他们无法记算出某个场地所需要的最长滑雪时间,进而安排获奖的时间段。他们现在请求你的帮助。
The Problem
我们把场地分为一个个的格子,给每个格子标定一个整数,代表这个格子所代表的地面的海拔高度。 比赛的参赛者可以从任意一个格子开始,但只能向相邻的四个格子移动,并且目地格子的高度必须小于现在所在格子的高度。我们假设从一个格子滑行到另一个格子所用的时间为1个单位时间。现在我们给出场地的大小(n*m)和每个格子所代表的地面的海拔高度。你能计算出在这个场地上最长能滑行多少时间吗?
输入
本题包括多组测试数据。每组测试数据的第一行为两个整数n和m(1<=m,n<=50),分别代表场地的行和列数。接下来是一个n*m的矩阵。包含每个格子所代表的地面的海拔高度。当n=m=0时输入结束,这组数据不包括在需要计算的数据中。
输出
对于每一组输入数据,输出一个整数,代表这个场地上最长能滑行多少时间。样例输入
4 41 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
0 0
样例输出
156
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
int Map[55][55];
int dp[55][55];
int deta[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int solve(int x, int y)
{
if (dp[x][y] > 0)
return dp[x][y];
for (int i = 0; i < 4; i++) {
int nx = x + deta[i][0];
int ny = y + deta[i][1];
if (0 <= nx && nx < n && 0 <= ny && ny < m && Map[nx][ny] < Map[x][y]) {
dp[x][y] = max(dp[x][y], solve(nx, ny) + 1);
}
}
return dp[x][y];
}
int main()
{
//freopen("F:\\test.txt", "r", stdin);
while (scanf("%d%d", &n, &m) && n && m) {
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
scanf("%d", &Map[i][j]);
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
ans = max(ans, solve(i, j));
}
printf("%d\n", ans);
}
return 0;
}