枚举路径的算法

时间:2012-09-09 09:35:19

标签: algorithm counting

假设你站在实线上的第0点。在每个步骤中,您可以移动到左侧l个位置,也可以移动到右侧r个位置。你打算到达数字p。此外,还有一些数字不允许您进入。你想知道你可以做多少。提到的所有数字都是整数(当然,l和r为正数)。什么是计算这个的好方法?

请注意。你也可以在旅程中踩到自己,所以在某些情况下答案是无限的。

2 个答案:

答案 0 :(得分:0)

它就像“L * x + R * y = P的多少整数(x,y)解”。

我相信这个问题有很多文章。

答案 1 :(得分:0)

这不是一个算法问题,而是一个数学问题。不过,这是解决方案。我们假设您的数字lr是正整数(它们都不为零)。

当且仅当等式r * x - l * y = p具有非负整数解(x, y)时,才存在解。该等式表示我们以任意顺序向右x次向左走{和y次。这个等式被称为Bézout identity,我们确切地知道它的解决方案是什么样的。

如果gcd(r,l)p,则存在整数解(x0, y0),其他每个解的格式都为x = x0 + k * r / gcd(l,r)y = y0 + k * l / gcd(l,r) {{1}遍历整数。显然,如果k大于k-x0 * gcd(l,r) / r,那么-y0 * gcd(l,r) / lx都是非负的,所以我们有无限多的解决方案。

如果y没有划分gcd(r,l),则没有解决方案,因为左侧始终可以被p整除,但右侧不是。

总之,您对解决方案进行计数的算法如下所示:

gcd(l,r)

在这一点上,尝试列举所有路径似乎毫无意义,因为这将是一项相当无聊的练习。对于每个非负解if p % gcd(l,r): return Infinity else: return 0 ,我们只列举所有可能的方法来安排(x,y)移动到右边,x移动到左边。将会有y个此类路径((x+y)!/(x! * y!)步骤选择x+y,这将是右侧的移动。