2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。

福大大 答案2021-05-06:

自然智慧即可。
动态规划。二维数组的所有位置,每个位置上下左右全部试一次。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    matrix := [][]int{{1, 2, 3}, {6, 5, 4}}
    ret := 0

    ret = longestIncreasingPath1(matrix)
    fmt.Println(ret)

    ret = longestIncreasingPath2(matrix)
    fmt.Println(ret)
}
func longestIncreasingPath1(matrix [][]int) int {
    ans := 0
    N := len(matrix)
    M := len(matrix[0])
    for i := 0; i < N; i++ {
        for j := 0; j < M; j++ {
            ans = getMax(ans, process1(matrix, i, j))
        }
    }
    return ans
}

// 从m[i][j]开始走,走出来的最长递增链,返回!
func process1(m [][]int, i int, j int) int {
    up := 0
    if i > 0 && m[i][j] < m[i-1][j] {
        up = process1(m, i-1, j)
    }
    down := 0
    if i < (len(m)-1) && m[i][j] < m[i+1][j] {
        down = process1(m, i+1, j)
    }

    left := 0
    if j > 0 && m[i][j] < m[i][j-1] {
        left = process1(m, i, j-1)
    }
    right := 0
    if j < (len(m[0])-1) && m[i][j] < m[i][j+1] {
        right = process1(m, i, j+1)
    }
    return getMax(getMax(up, down), getMax(left, right)) + 1
}

func longestIncreasingPath2(matrix [][]int) int {
    ans := 0
    N := len(matrix)
    M := len(matrix[0])
    dp := make([][]int, N)
    for i := 0; i < N; i++ {
        dp[i] = make([]int, M)
    }
    for i := 0; i < N; i++ {
        for j := 0; j < M; j++ {
            ans = getMax(ans, process2(matrix, i, j, dp))
        }
    }
    return ans
}

// 从m[i][j]开始走,走出来的最长递增链,返回!
func process2(m [][]int, i int, j int, dp [][]int) int {
    //fmt.Println("i=", i, ",j=", j)
    if dp[i][j] != 0 {
        return dp[i][j]
    }
    // (i,j)不越界
    up := 0
    if i > 0 && m[i][j] < m[i-1][j] {
        process2(m, i-1, j, dp)
    }

    down := 0
    if i < (len(m)-1) && m[i][j] < m[i+1][j] {
        down = process2(m, i+1, j, dp)
    }

    left := 0
    if j > 0 && m[i][j] < m[i][j-1] {
        left = process2(m, i, j-1, dp)
    }

    right := 0
    if j < (len(m[0])-1) && m[i][j] < m[i][j+1] {
        right = process2(m, i, j+1, dp)
    }

    ans := getMax(getMax(up, down), getMax(left, right)) + 1
    dp[i][j] = ans
    return ans
}

func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

执行结果如下:
图片


左神java代码