从左上角到右下角遍历2D阵列的方法数

时间:2018-03-28 21:11:56

标签: multidimensional-array combinations

在编程访谈的元素中遇到了这个问题(16.3)。我遵循DP解决方案,但他们也提供了我没有的分析解决方案。问题陈述:

编写一个程序,计算2D阵列中从左上角到右下角的方式。

分析解决方案:

使用从(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 个答案:

答案 0 :(得分:1)

由于每条路径由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

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

答案 1 :(得分:0)

我认为问题陈述并不完整,分析解决方案只有在每个步骤中才能正常运行 如果我们只能向上或向右,那么我们需要(n - 1) + (m - 1)步骤,要在这些步骤的(n - 1)步骤中到达左上角我们必须正确,而在其他方面我们必须向上 问题的答案是((n + m - 2) choose (n - 1)) or ((n + m - 2) choose (m - 1))