题解 | 滑雪
滑雪
https://www.nowcoder.com/practice/36d613e0d7c84a9ba3af3ab0047a35e0
import java.util.*;
// 这题求的是长度,每次+1
public class Main {
static int[][] dirs = new int[][] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt(), n = in.nextInt();
int[][] arr = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = in.nextInt();
}
}
System.out.println(process(m, n, arr));
}
private static int process(int m, int n, int[][] arr) {
int[][] dp = new int[m][n];
// for(int i=0;i<m;i++) Arrays.fill(dp[i],1);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dfs(i, j, m, n, arr, dp);
}
}
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans = Math.max(ans, dp[i][j]);
}
}
return ans;
}
private static int dfs( int i, int j, int m, int n, int[][] arr, int[][] dp) {
if (i < 0 || j < 0 || i >= m || j >= n) return 0;
if (dp[i][j] != 0) return dp[i][j];
int max = 1;
for (int[] dir : dirs) {
int ni = i + dir[0], nj = j + dir[1];
if (ni >= 0 && nj >= 0 && ni < m && nj < n && arr[ni][nj] > arr[i][j]) {
max = Math.max(max, dfs(ni, nj, m, n, arr, dp) + 1);
}
}
dp[i][j] = max;
return max;
}
}

查看6道真题和解析