• 2021-02-19:给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角。沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和。请问最小距离累加和是多少?


    2021-02-19:给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角。沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和。请问最小距离累加和是多少?

    福哥答案2021-02-19:
    自然智慧即可。
    一般会考虑dp[i][j]的右边和下边,谁小选谁,虽然你能确定下一步是最小值,但是下一步的以后就不一定是最小值了,不是路径最优。逆向思维,dp[i][j]的左边和上边,谁小选谁,左边和上边已经确定了,肯定路径最优。这道题可以用空间压缩技巧,所以dp不需要二维数组,用一维数组即可。这揭示了一个人生道理:未来是不确定的,过去是确定的。
    代码用golang编写,代码如下:

    package main
    
    import "fmt"
    
    func main() {
        if true {
            arr := [][]int{
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12},
                {13, 14, 15, 16}}
            ret := minPathSum(arr)
            fmt.Println(ret)
        }
    }
    func minPathSum(m [][]int) int {
        row := len(m)
        if row == 0 {
            return 0
        }
        col := len(m[0])
        if col == 0 {
            return 0
        }
        dp := make([]int, col)
        dp[0] = m[0][0]
        for j := 1; j < col; j++ {
            dp[j] = dp[j-1] + m[0][j]
        }
        for i := 1; i < row; i++ {
            dp[0] += m[i][0]
            for j := 1; j < col; j++ {
                dp[j] = getMin(dp[j-1], dp[j]) + m[i][j]
            }
        }
        return dp[col-1]
    }
    func getMin(a int, b int) int {
        if a < b {
            return a
        } else {
            return b
        }
    }
    

    执行结果如下:
    图片


    左神java代码
    评论

  • 相关阅读:
    哇塞 今天是数论专场呢 我要爆炸了
    树状数组模板题 hdu 1166
    [思维]Radar Scanner
    [思维]Minimum Spanning Tree
    [容斥]数对
    [概率]Lucky Coins
    [数学]特征方程求线性递推方程的通项公式
    [树状数组][2019徐州网络赛I]query
    [计算几何]Piece of Cake
    [欧拉降幂][2019南京网络赛B]super_log
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14418542.html
Copyright © 2020-2023  润新知