牛客网: BM61
求矩阵的最长递增路径
解题思路:
1. 遍历二维矩阵每个位置,max求出所有位置分别为终点时的最长路径
2. 求某个位置为终点的最长路径时,使用动态规划dp对已经计算出的位置进行记录
3. 处理某个位置的最长路径时,如果dp[i][j]位置已有值,则直接返回即可,否则对此位置赋值1,再对上下左右4个方向进行递归求解,每次递归后返回的最长路径需+1才是当前位置的最长路径,使用max选择最大值赋予dp[i][j],4个方向均遍历完后返回dp[i][j]给主程序。
代码:
- // go
-
- package main
- // import "fmt"
-
- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- * 递增路径的最大长度
- * @param matrix int整型二维数组 描述矩阵的每个数
- * @return int整型
- */
- func max(x, y int) int {
- if x > y {return x} else {return y}
- }
- var dirs = [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
-
- func process(matrix, dp [][]int, i, j, m, n int) int {
- if dp[i][j] > 0 {
- return dp[i][j]
- }
- dp[i][j] = 1
- for k := 0; k < 4; k++ {
- nexti := i + dirs[k][0]
- nextj := j + dirs[k][1]
- if nexti >= 0 && nexti < m && nextj >= 0 && nextj < n && matrix[nexti][nextj] < matrix[i][j] {
- dp[i][j] = max(dp[i][j], process(matrix, dp, nexti, nextj, m, n) + 1)
- }
- }
- return dp[i][j]
- }
-
- func solve( matrix [][]int ) int {
- // write code here
- if len(matrix) == 0 || len(matrix[0]) == 0 {
- return 0
- }
- m := len(matrix)
- n := len(matrix[0])
- dp := make([][]int, m)
- for i := 0; i < m; i++ {
- dp[i] = make([]int, n)
- }
- res := 0
- for i := 0; i < m; i++ {
- for j := 0; j < n; j++ {
- res = max(res, process(matrix, dp, i, j, m, n))
- }
- }
- return res
- }