如何解决唯一路径问题

动态编程方法。

在开始之前,让我们讨论一下这个问题。

机器人位于网格(m * n)的左上角(在下图中标记为“开始”)。

机器人每次只能向下或向右移动。 机器人试图到达网格的右下角(在下图中标记为“完成”)。

有多少种可能的独特路径?

了解问题:

该问题要求从网格的左上角到右下角有多少个唯一路径。

现在让我们来看一个场景。 假设给出了一个3 * 2的网格。 我们的目标是从左上角到达右下角。

因此,根据条件,让我们看看可以生成什么。

Path-1: Right → Right → Down
Path-2: Right → Down → Right
Path-3: Down → Right → Right

放在那儿。 这就是这种情况的解决方案。 有三种独特的路径。 我们尝试的方法不是动态编程。 现在,一个幻想的词到了。 它是什么? 让我们来看看…

动态编程:

(DP)是计算机编程中的一种技术,可帮助有效解决一类具有重叠子问题和最佳子结构属性的问题。

这些问题涉及重复计算相同子问题的值以找到最佳解决方案。

让我们以阶乘问题为例。 在数学中,正整数n的阶乘,用n!表示。 这是所有小于或等于n的正整数的乘积。

例如,

5! = 5*4*3*2*1 = 120

现在,用于查找阶乘的函数的参数为​​6。因此,阶乘函数将再次执行,

6! = 6*5*4*3*2*1 = 720

我们可以将这个阶乘6除以一个子问题。

6! = 6* 5!

因此,如果我们保存5! 在一个位置上再计算6! 对我们来说将很容易。 我们需要将数字乘以其先前计算的阶乘。 结果,我们减少了操作数量。 这是动态编程的基础。

现在让我们解决我们的问题。 如果我们尝试形象化所有方式,那将是艰难的。 因此,我们的首要任务是将问题分为多个子问题。 假设目标不是终点,而不是目标。 只有一种方法可以到达那里,只需要向右移动,对于起点下方的单元格也要使用相同的方法,必须向下移动。 那对角正方形呢? 好吧,我们有两种方法。

1. From start to right, then down
2. From start to down, then right

我们如何计算数字呢? Aa..ha。 这取决于这两个步骤。 如果我们存储从起点向右和向下移动的方式数量,我们要做的就是将这两种方式添加到对角线之一。

如果我们有一个大小为m * n的网格,现在让我们扩展视图。 从一开始就可以达到正确平方的方法有多少种。 它应该为1,因为我们没有改变方向,对于起点的以下正方形也是如此。

第一行将填充1,因为只有一种方法可以到达每个正方形。 第一列相同。 现在我们必须填充其余的正方形。 我们需要两个循环来遍历每个正方形。 它将用其顶部平方值和左侧平方值之和填充它们。 最终结果将存储在右下角。

现在终于可以完成四个步骤了。

1. Fill the first row with 1
2. Fill the first column with 1
3. Fill the rest of the squares with the sum of its top square value and left square value.
4. Return the bottom- right corner square value.

假设我们有一个4 * 3的网格。

首先,让我们制作一个4 * 3大小的矩阵dp。 并在第一行和第一栏中填充1。

第二列第一个空白处将填充其顶部和左侧的平方和。 如果该地点是dp [i] [j],则它将以dp [i-1] [j] + dp [i] [j-1]填充

我们将按照相同的过程填充第二行的其余空白位置。

最后一行也一样

我们的最终结果将存储在右下角的正方形,即

dp[i][j] = dp[i-1][j] + dp[i]dp[j-1]
dp[3][4] = dp[2][4]+dp[3][3]
dp[3][4] = 4 + 6 = 10

所以,解决这个问题的红宝石方法应该是这样的

def unique_paths (m, n)
  0 if m == 0 || n == 0
  dp = Array.new(n) { Array.new(m, 0 ) }
  for i in 0 ...n
    dp[i][ 0 ] = 1
  end
  for j in 0 ...m
    dp[ 0 ][j] = 1
  end
  for i in 1 ...n
    for j in 1 ...m
      dp[i][j] = dp[i- 1 ][j] + dp[i][j- 1 ]
    end
    print dp
  end
  dp[n- 1 ][m- 1 ]
end

时间复杂度

该算法的时间复杂度为O(m * n)。 随着迭代进行到整个网格的大小。

空间复杂度

该算法的主要因素是2D阵列。 其大小取决于其行和列。 因此,该算法的空间复杂度也是O(m * n)。

了解更多信息:

https://www.geeksforgeeks.org/dynamic-programming /

https://leetcode.com/problems/unique-paths/

From: https://hackernoon.com/how-to-solve-unique-path-problem-zj4qt30z3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值