代码之家  ›  专栏  ›  技术社区  ›  connorwstein

从左上到右下遍历二维阵列的方法数

  •  0
  • connorwstein  · 技术社区  · 6 年前

    在《编程面试要点》(16.3)中遇到了这个问题。我遵循DP解,但他们也给出了我没有给出的解析解。问题陈述:

    编写一个程序,计算在二维阵列中从左上角到右下角可以走多少条路。

    解析解:

    利用从(0,0)到(n-1,m-1)的每条路径是m-1水平步和n-1垂直步的序列这一事实,必须有(n+m-2)选择(n-1)=(n+m-2)/((n-1)!(m-1)!此类路径。

    我得到的等式只是应用了n选择k公式,我看到n+m-2=(n-1)+(m-1)。但我真的不知道为什么路径数是(n-1)+(m-1)选择(n-1)作为开始?从移动的总数中,我们选择一组垂直移动?为什么路径数是这样的?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Community arnoo    4 年前

    由于每条路径由m-1个水平台阶和n-1个垂直台阶组成,因此每条路径中总共有m+n-2个台阶。要选择特定路径,可以定义垂直或水平台阶。假设您已经定义了所有垂直台阶(即其中的n-1个)。一旦定义了它们,就没有其他步骤(水平步骤)的实际选择-每个水平步骤只有一种可能性(在相邻垂直步骤之间建立连接)。因此,从m+n-2中选择n-1定义了一条有效路径。路径总数将是从m+n-2中选择n-1的可能性数(选择m-1而不是n-1可以获得相同的结果)。

    参见以下示例:

    enter image description here

    假设您选择了垂直步骤(红色步骤)-完成后,每个水平步骤只有一个选项(蓝色步骤)。否则,路径将是非连续的,因此无效。

        2
  •  0
  •   nyi    6 年前

    我认为问题陈述是不完整的,只有在每一步你只能向上或向右时,解析解才有效 如果我们只能向上或向右,那么我们需要 (n - 1) + (m - 1) 步骤,到达中的左上角 (n - 1) 在这些步骤中,我们必须向右走,在其他步骤中,我们必须向上走 问题的答案是 ((n + m - 2) choose (n - 1)) or ((n + m - 2) choose (m - 1))