题解 | 滑雪

滑雪

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

import java.util.*;

public class Main {
    static int n;
    static int m;
    static int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; // 四个方向

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        int[][] graph = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                graph[i][j] = in.nextInt();
            }
        }

        int[][] dp = new int[n][m]; // dp[i][j]表示从点(i, j)开始的最长滑行路径长度
        int res = 0;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) { // 遍历整个矩阵
                res = Math.max(res, dfs(graph, dp, i, j)); // 计算从每个点出发的最长路径
            }
        }

        System.out.println(res);
    }

    static int dfs(int[][] graph, int[][] dp, int x, int y) {
        if (dp[x][y] != 0) {
            return dp[x][y]; // 如果已经计算过,直接返回结果
        }

        dp[x][y] = 1; // 初始化为1,表示至少包含当前点
        for (int[] dir : dirs) {
            int curX = x + dir[0];
            int curY = y + dir[1];
            if (curX >= 0 && curX < n && curY >= 0 && curY < m && graph[curX][curY] < graph[x][y]) {
                dp[x][y] = Math.max(dp[x][y], dfs(graph, dp, curX, curY) + 1);
            }
        }

        return dp[x][y];
    }
}

深度优先搜索+动态规划

全部评论

相关推荐

VirtualBool:都去逗他了?
点赞 评论 收藏
分享
喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务