题解 | 滑雪

滑雪

https://www.nowcoder.com/practice/36d613e0d7c84a9ba3af3ab0047a35e0

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1001;
int f[MAXN][MAXN];
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int dp[MAXN][MAXN]; // 记忆化数组
int n, m;

int dfs(int x, int y) {
    if (dp[x][y] != 0) return dp[x][y]; // 已计算过,直接返回
    int max_step = 1; // 初始为1,自身算一步
    for (int i = 0; i < 4; i++) {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
        if (f[x][y] > f[nx][ny]) {
            max_step = max(max_step, dfs(nx, ny) + 1); // 递归并更新最大步数
        }
    }
    dp[x][y] = max_step; // 保存结果
    return max_step;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> f[i][j];
        }
    }
    int maxx = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            maxx = max(maxx, dfs(i, j)); // 计算每个点的最长路径
        }
    }
    cout << maxx << endl;
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务