【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)

🧭 网格路径类 DP 系列题:不同路径 & 最小路径和(LeetCode 62 / 64)

  • 🧮 62. 不同路径(计算路径总数)
  • 💰 64. 最小路径和(求路径最小代价)

🧮 62. 不同路径(Unique Paths)

📌 题目描述

一个机器人位于一个 m x n 网格左上角,只能向下或向右移动,每次一步。问有多少条不同路径可以走到右下角?


🧠 解题思路

这是一道经典的二维动态规划问题。

✅ 状态定义

dp[i][j] 表示走到第 i 行第 j 列的路径数量。

🔁 状态转移

机器人只能从上方或左方到达 (i,j)

go 复制代码
dp[i][j] = dp[i-1][j] + dp[i][j-1]
🎯 初始条件
  • 第一行 & 第一列都只有一条路径可达。

✅ Go 实现(二维 DP)

go 复制代码
func uniquePaths(m int, n int) int {
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
        dp[i][0] = 1
    }
    for j := 0; j < n; j++ {
        dp[0][j] = 1
    }

    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
        }
    }
    return dp[m-1][n-1]
}
💡 空间优化

由于每次只依赖上一行和当前行,可以用一维数组滚动更新:

go 复制代码
func uniquePaths(m int, n int) int {
    dp := make([]int, n)
    for i := range dp {
        dp[i] = 1
    }

    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            dp[j] += dp[j-1]
        }
    }
    return dp[n-1]
}

💰 64. 最小路径和(Minimum Path Sum)

📌 题目描述

给定一个 m x n 的网格,每个单元格内有一个非负整数,求从左上角到右下角一条路径,使得路径上数字总和最小。


🧠 解题思路

与上一题相似,不过这题是求最小路径代价

✅ 状态定义

dp[i][j] 表示走到 (i,j) 所需的最小路径和。

🔁 状态转移

只能从上方或左方来:

go 复制代码
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

✅ Go 实现

go 复制代码
func minPathSum(grid [][]int) int {
    m, n := len(grid), len(grid[0])
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
    }

    dp[0][0] = grid[0][0]
    for i := 1; i < m; i++ {
        dp[i][0] = dp[i-1][0] + grid[i][0]
    }
    for j := 1; j < n; j++ {
        dp[0][j] = dp[0][j-1] + grid[0][j]
    }

    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
        }
    }
    return dp[m-1][n-1]
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

🔚 总结与对比

题目 目标 状态定义 转移逻辑 可否空间优化
62. 不同路径 统计路径条数 dp[i][j] 为到达 (i,j) 的路径数 dp[i-1][j] + dp[i][j-1] ✅ 可用一维数组优化
64. 最小路径和 求最小路径值 dp[i][j] 为到达 (i,j) 的最小和 min(dp[i-1][j], dp[i][j-1]) + grid[i][j] ✅ 可用一维数组优化

✏️ 思维延伸

如果想更进一步,可以尝试:

    1. 不同路径 II(加上障碍)
    1. 三角形最小路径和(从底向上 DP)
    1. 下降路径最小和(支持斜着走)

这类问题的关键在于:

✅ 明确"状态"

🔁 写出"转移"

🎯 找准"边界"


相关推荐
小龙报12 分钟前
《算法通关指南数据结构和算法篇(2)--- 链表专题》
c语言·数据结构·c++·算法·链表·学习方法·visual studio
艾莉丝努力练剑32 分钟前
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和
大数据·人工智能·线性代数·算法·矩阵·二维前缀和
醉颜凉34 分钟前
环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧
c语言·算法·动态规划
mjhcsp35 分钟前
C++ 动态规划(Dynamic Programming)详解:从理论到实战
c++·动态规划·1024程序员节
大雨淅淅37 分钟前
一文搞懂动态规划:从入门到精通
算法·动态规划
不去幼儿园39 分钟前
【启发式算法】灰狼优化算法(Grey Wolf Optimizer, GWO)详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法
随意起个昵称40 分钟前
【二分】洛谷P2920,P2985做题小记
c++·算法
没书读了1 小时前
计算机组成原理-考前记忆清单
线性代数·算法
Hcoco_me1 小时前
大模型面试题5:矩阵(M*M)特征值分解的步骤
算法·机器学习·矩阵
非著名架构师2 小时前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测