滑雪比赛(记忆dp)

BackGroud

今年冬天,到西岭雪山上滑雪的人越来越多。滑雪场的管理人员为了提高游客滑雪的兴趣,决定组织一场滑雪比赛。但他们在比赛地点的选择上出现了困难,因为他们无法记算出某个场地所需要的最长滑雪时间,进而安排获奖的时间段。他们现在请求你的帮助。

The Problem

我们把场地分为一个个的格子,给每个格子标定一个整数,代表这个格子所代表的地面的海拔高度。 比赛的参赛者可以从任意一个格子开始,但只能向相邻的四个格子移动,并且目地格子的高度必须小于现在所在格子的高度。我们假设从一个格子滑行到另一个格子所用的时间为1个单位时间。现在我们给出场地的大小(n*m)和每个格子所代表的地面的海拔高度。你能计算出在这个场地上最长能滑行多少时间吗?

输入

本题包括多组测试数据。每组测试数据的第一行为两个整数n和m(1<=m,n<=50),分别代表场地的行和列数。接下来是一个n*m的矩阵。包含每个格子所代表的地面的海拔高度。当n=m=0时输入结束,这组数据不包括在需要计算的数据中。

输出

对于每一组输入数据,输出一个整数,代表这个场地上最长能滑行多少时间。

样例输入

4 4
1 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

样例输出

15

6


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值