我无法理解路径数量以下的问题如何(x + y)!/ x!y! ..我理解它来自于从X + Y项目的路径中选择X项目,但为什么不选择x项目超过x + y +选择y项目而不是x + y?为什么它必须只是x?
机器人位于m x n网格的左上角(标记为 在下图中“开始”)。机器人只能向下或向下移动 在任何时间点。机器人正试图到达 网格的右下角(图中标记为“完成”) 下面)。有多少可能的路径?
答案 0 :(得分:3)
这有点基于Mukul Joshi's answer,但希望有点清楚。
要从0,0
转到x,y
,您需要完全向右移动x
次并向下移动y
次。
让每个右移动由0
表示,向下移动由1
表示。
让一串0
和1
s表示从0,0
到x,y
的路径。此路径将包含x
0
和y
1
s。
现在我们要计算所有这些字符串。这相当于计算包含x
0
和y
1
s的任何字符串的排列数。这个字符串是一个多重集(每个元素可以出现多次),因此我们想要一个multiset permutation,可以计算为n!/(m1!m2!...mk!)
,其中n
是字符总数{{ 1}}是唯一字符的数量,k
是mi
唯一字符重复的次数。由于总共有i
个字符,x+y
重复0
次,而x
重复1
次,我们会y
。
时间复杂度:
回溯/暴力的时间复杂性将涉及必须探索所有这些路径。把它想象成一棵树,有(x+y)!/x!y!
个叶子。我可能错了,但我认为具有分支因子(x+y)!/x!y!
的树中的节点数可以表示为叶数的大O,因此我们最终得到> 1
个节点,并且因此同样的复杂性。
答案 1 :(得分:2)
好的,我给你解决这个问题的方法,以便你有更好的时间来抓住它
首先,让我们决定解决方案算法。我们将计算每个细胞的所有可能路径,以便从中获得结束。该算法将检查单元格并写入右侧和底部单元格的总和。我们这样做是因为机器人可以向下移动并沿着任何底部路径移动或向右移动并沿着任何右侧路径行进,因此,添加不同路径的总数。对我来说很明显证明了这些路径的多样性。如果你想我可以在评论中这样做
对于最右边的底部单元格(完成),单元格的初始值将为1,因为从该单元格到达那里只有一种方法(根本不移动)。并且如果不存在细胞(例如,对于最下面的细胞采用底部细胞),则其值为0
逐个构建单元格值将导致Pascal's Triangle在(x,y)单元格中值为(x + y)! / x! / y!
,其中x是距离完成的Ox距离,y是Oy。
谈到复杂性,我们将对网格单元进行x * y
次迭代,每次迭代都是一个恒定的时间。如果您不想使用回溯算法,可以使用上面提到的公式并使用O(x + y)代替O(x * y)
答案 2 :(得分:1)
这里有解释。
无论你如何前往目的地,路径必须有m行和n列。
考虑您将1表示为行,将列表示为0.您的路径是一个m + n个字符的字符串。但它只能有m 1和n 0。
如果你有m + n个不同的字符,那么排列的数量将是(m + n)!但是当你有重复的字符时,它将是(m + n)!/ m!n!请参阅this
当然这将是独一无二的。测试4 * 3网格,你可以看到它。
答案 3 :(得分:1)
您没有添加“我可以通过多少种方式分发我的X动作?” “我可以用多少种方式分发我的Y动作?”有两个原因:
注意,对于#1,X没有什么特别之处 - 我可以轻松选择Y并说:“Y移动和X移动的分布不是独立的。对于Y移动的每个配置,只有1个可能X动作的配置。“这就是为什么,正如其他人所指出的那样,计算分配Y动作的方式的数量与计算分配X动作的方式的数量相同。