数据结构与算法之 leetcode 动态规划不同路径 二维网格路径数

数据结构与算法阿木 发布于 8 天前 2 次阅读


动态规划解决LeetCode:二维网格路径数问题

动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中广泛使用的方法。它通过将复杂问题分解为更小的子问题,并存储这些子问题的解,从而避免重复计算,提高算法效率。在LeetCode等编程竞赛平台中,动态规划是解决许多算法问题的重要工具之一。

本文将围绕LeetCode上的一个经典问题——“不同路径”(Unique Paths)展开,探讨如何使用动态规划方法解决二维网格路径数问题。

问题分析

题目描述:给定一个m行n列的二维网格,一个机器人从左上角开始,每次只能向下或向右移动,到达右下角。请问有多少种不同的路径?

示例:


输入:m = 3, n = 7


输出:28


在这个问题中,机器人从左上角到右下角,需要向下移动m-1次,向右移动n-1次。问题可以转化为求解一个组合问题:从m-1+n-1次移动中选择m-1次向下移动的方法数。

动态规划解法

状态定义

定义dp[i][j]为到达点(i, j)的路径数。

状态转移方程

对于任意点(i, j),它可以从点(i-1, j)或点(i, j-1)移动到。到达点(i, j)的路径数等于到达点(i-1, j)和点(i, j-1)的路径数之和。

状态转移方程如下:


dp[i][j] = dp[i-1][j] + dp[i][j-1]


初始状态

对于二维网格的左边界和上边界,机器人只能从左上角向右或向下移动,因此这些点的路径数都为1。

初始状态如下:


dp[0][j] = 1 (j = 0, 1, ..., n-1)


dp[i][0] = 1 (i = 0, 1, ..., m-1)


空间优化

由于状态转移方程只依赖于前一行和前一列的值,我们可以使用一维数组来存储状态,从而降低空间复杂度。

代码实现

python

def uniquePaths(m, n):


初始化一维数组


dp = [1] n

遍历二维网格


for i in range(1, m):


for j in range(1, n):


根据状态转移方程更新路径数


dp[j] = dp[j] + dp[j-1]

返回右下角的路径数


return dp[-1]


时间复杂度和空间复杂度

时间复杂度:O(mn),因为我们需要遍历整个二维网格。

空间复杂度:O(n),因为我们使用了一维数组来存储状态。

总结

本文通过动态规划方法解决了LeetCode上的二维网格路径数问题。动态规划是一种强大的算法工具,在解决许多算法问题时具有广泛的应用。通过理解状态定义、状态转移方程和初始状态,我们可以有效地使用动态规划方法解决实际问题。在实际应用中,我们还可以通过空间优化来提高算法的效率。