【问题标题】:Count paths in a grid with multiple checkpoints计算具有多个检查点的网格中的路径
【发布时间】:2015-02-10 12:52:26
【问题描述】:

给定一个大小为N X N 的网格。它的左下角是(0,0),右上角是(N-1,N-1)

我们可以向上或向右遍历网格。我们必须找到从左下角到右上角的遍历方式的数量。 每条路径都有一些检查站,我们必须访问这些检查站。至少有一个有效路径。

示例:N=5,我们在(2,2) 有1 个检查点,那么这里的答案是36

注意:我只需要计算有效路径,无需担心找到它们。

什么是计算它们的有效方法?

【问题讨论】:

  • 有效路径必须是单调的吗?
  • 在您的教科书中查找“动态编程”。
  • 搬家有什么限制?如果不添加约束,这似乎不是算法问题,而是关于组合学的更多问题;还有什么是“最高方向”?
  • @timrau 你说的单调是什么意思?
  • 每一步都必须朝右还是朝上?

标签: c++ algorithm


【解决方案1】:

你必须知道两件事:

  1. Rule of product:表示起点到终点的路数等于起点到中点的路数*中点到终点的路数。

  2. C(R,R+U)R 是您向右移动的次数,U 是向上移动的次数,这意味着如果您想从 (a,b) 转到(c,d) 然后是 R = c-aU = d-bC(R,R+U) = (R+U)!/R!U! )是网格中从左下角到右上角有多少种方式的答案。

示例在我的第二条规则中的示例中,我们有:

(0,0)(2,2) 的移动次数,因为从0 向右移动两次后,您到达2,从0 向上移动两次后,您到达2,所以R=2U=2所以C(2,2+2) = C(2,4) = 4!/2!2! = 6。对RU 执行相同操作,从(2,2)(4,4) 的移动次数为C(2,2+2) = C(2,4) = 4!/2!2! = 6

根据第一条规则,我们有所有可能移动的数量:6 * 6 = 36

【讨论】:

  • 你如何找到像这里的 R 和 U:从 (2,2) 到 (4,4) 的移动次数是 C(2,2+2)?
  • 假设我们要从 (a,b) 移动到 (c,d) 那么你的 R 和 U 是多少?
  • 假设我们在 (3,2) 还有一个检查站,那么请解释一下您的方法
  • @user3840069 我添加了你想要的细节:)
  • @user3840069 访问检查点的顺序是预定义的——你永远不能在(2,2)之前访问(3,2)而不是在(4,4)之后,所以顺序必须是(2,2) ),(3,2),(4,4)。如果你想从 (x1,y1) 到 (x2,y2) - L=x2-x1, R=y2-y1
【解决方案2】:

使用动态规划:

dp[k, i, j] = number of paths from checkpoint k to (i, j)

dp[k, i, j] = dp[k, i - 1, j] +        top
              dp[k, i, j - 1]          right

答案是检查点之间dp 值的乘积。

注意:您可以通过意识到矩阵中的实际位置无关紧要,只需考虑位置与检查点位置之间的相对距离,即可避免使用第一个维度。

【讨论】:

  • @IVIAd 我不明白你的 DP。这里有什么?
  • @user3840069 - 如果您有更确切的问题,我很乐意回答,但在您自己努力之前我不会说得更清楚。
  • 对我来说似乎有点过头了,如果没有障碍物,从 (x1,y1) 到 (x2,y2) 的路径数是一个封闭公式
  • @amit - 这个公式很好,也有它的价值,但是:1. 可以说它更难理解; 2. 如果你想得到模数的答案(你可能会这样做,因为路径的数量增长得非常快),因为它涉及到因子除法甚至更多的组合学知识。所以我不会说这是矫枉过正。这不是最快的解决方案,但我认为它是最简单的。
  • @amit - 你必须实现选择模数,而不是阶乘模数。这些涉及除法,因此您不能预先计算阶乘。您要么必须实现阶乘分数简化,要么使用组合的递推公式(这实际上又是 DP)。所以我仍然认为它更难实现。
【解决方案3】:

这个特定问题的关键是找到子点之间的路径数(根据它们各自的位置排序后),然后将所有路径数相乘。

这里的解决方案是:

1.从源到目标对点进行排序。

示例: 如果起点是 [0,0] 终点是 [10,10] 并且中间点是 [5,6],[2,4] & [8,8],那么排序点(包括源和目标)将在 11X11 矩阵中为 [0,0]、[2,4]、[5,6]、[8,8]、[10,10]

2。查找从源到下一个子目标的路径数(最好使用 DP)。 (按排序点排序)

在上面的示例中,需要计算的路径数将介于以下点之间:

[0,0] 到 [2,4]

[2,4] 到 [5,6]

[5,6] 到 [8,8]

[8,8] 到 [10,10]

3.找出以上 4 个子路径的乘积

就是这样

这是一个solution,用于查找来自源和目标的路径数(参见 DP 方法)。您不需要将矩阵作为参数传递,因为这不是必需的。仅需要 [x,y] [X,Y] 形式的源点和目标点。除了链接中的代码之外,其他部分(对点进行排序和相乘)必须按照上面的说明完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多