每日一题:矩阵中最长递增路径(记忆化搜索)

题意

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

Solution

记忆化搜索模板题。$dp[i][j]$记录之前已经计算得到的结果,之后直接读取即可。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution329 {
/*
[7,8,9]
[9,7,6]
[7,2,3]
输出:6
*/

public int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public int n, m;

public int dfs(int[][] a, int[][] dp, int x, int y) {
if(dp[x][y] != 0)
return dp[x][y];
dp[x][y] = 1;
for(int[] dir : dirs) {
int fx = x + dir[0], fy = y + dir[1];
if(fx >= 0 && fx < n && fy >= 0 && fy < m && a[fx][fy] > a[x][y])
dp[x][y] = Math.max(dp[x][y], dfs(a, dp, fx, fy) + 1);
}
return dp[x][y];
}

public int longestIncreasingPath(int[][] a) {
n = a.length;
if(n == 0)
return 0;
m = a[0].length;
int res = 1;
int[][] dp = new int[n][m];

for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
res = Math.max(res, dfs(a, dp, i, j));
}
}
return res;
}
}
作者

Benboby

发布于

2020-07-26

更新于

2021-01-28

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×