【问题标题】:Algorithm to enumerate paths枚举路径的算法
【发布时间】:2012-09-02 12:16:27
【问题描述】:

假设你站在实线的 0 点。在每一步,您可以移动到左侧 l 个位置,也可以移动到右侧 r 个位置。您打算到达数字 p。另外,有些号码是不允许踩的。你想数一数你能做到这一点。提到的所有数字都是整数(当然,l 和 r 是正数)。什么是计算这个的好方法?

注意。你也可以在旅途中踩到 p 本身,所以在某些情况下答案是无限的。

【问题讨论】:

  • 如果在点 0 r = 3,你可以步行到 1、2、3 还是只步行到 3?
  • 你必须直接去r = 3。
  • 如果有循环怎么办,例如在 0 r = 3,在 3 l = 3?事实上,如果有两种方法可以到达终点线,那么一定有一个循环
  • 如果允许你踩到每一个数字,这很容易,因为答案要么是零,要么是无穷大。 (取决于 l 和 r 的最大公约数是否整除 p)。
  • @robert: l 和 r 在整个旅程中都是固定的。答案可能是无限的。

标签: algorithm counting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这不是一道算法题,而是一道数学题。不过,这是解决方案。让我们假设您的数字 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),其中k 贯穿整数。显然,如果k 大于-x0 * gcd(l,r) / r-y0 * gcd(l,r) / l,那么xy 是非负的,所以我们有无限多个解。

    如果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 步骤中选择x 这将是向右移动)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多