【问题标题】:Solve google foobar staircase problem with python用python解决google foobar staircase问题
【发布时间】:2021-03-24 23:28:57
【问题描述】:

给定n 的砖块数量,我找出可以建造多少个不同的楼梯:每个楼梯必须至少有 2 个台阶。不允许两个台阶处于相同高度 - 每个台阶必须低于前一个台阶。所有台阶必须至少包含一块砖。台阶的高度被归类为构成该台阶的砖的总量。 例如,当 N = 5 时,您有 2 种选择如何建造楼梯(# 表示砖):

   # 1
#### 4

 ## 2
### 3

我实际上已经设法解决了这个问题:更明显的方法是使用itertools 找到所有可能的组合,然后选择可能的组合。但是我终于想出了这样的事情:

def _solution(bricks, struct):
  result = 0
  for used_bricks in range(1, bricks if not struct else struct[-1]):
    elapsed_bricks = bricks - used_bricks
    result += _solution(elapsed_bricks, [*struct, used_bricks])
  if not bricks:
    # print(struct)
    result += 1
  return result

def solution(n):
  if not n:
    return 0
  return _solution(n, [])

这很有效,太棒了!如果我调用solution(6),它会按预期返回3,但是这种函数递归方法对于n 的低值非常有效,计算n = 100 需要一个小时,但是我正在做的仍然是计算所有可能的排列。有没有最快的方法来做到这一点?

【问题讨论】:

  • 不允许有两个台阶处于相同高度 - 每个台阶都必须低于前一个台阶。 高度是什么意思?从您的图中可以看出,您似乎指的是每个步骤的广度。也要求所有的砖都必须用完还是可能留下一些?
  • 不,必须使用所有积木,否则我的示例将不会只有 2 个解决方案。台阶的高度被归类为构成该台阶的砖的总量:)

标签: python python-3.x algorithm


【解决方案1】:

it took an hour to calculate n = 100
因为您的解决方案是指数级的,对于标准机器来说,这是意料之中的。

each staircase must have at least 2 steps. No two steps are allowed to be at 
the same height - each step must be lower than the previous one. All steps must 
contain at least one brick 

由此我们可以推断,对于某些数量的砖块 N,任何解决方案的阶梯都是从 1 到 N-1 的自然数的升序排序,使得它们的总和为 N,并且每个数字都是唯一的。
这个问题可以简化为分区问题,我们需要找到 N 个分区的总数,使得每个分区的大小都是唯一的。

SkN 为 N 的分区数,使得每个和数都是从 1 到 k。
这遵循重复, SkN = Sk-1N-k + Sk-1N
SN-1N
这是使用自下而上动态规划的解决方案,O(N2),

def _solution(bricks):
    S = [1, *([0]*(bricks))]
    for i in range(1, bricks):  # k for our Sk(N) 
        for j in range(bricks, i-1, -1):  # N for our Sk(N)
            S[j] += S[j-i]  
    return S[bricks]

def solution(n):
  if not n or n < 3:  #2 steps min. are required which requires (1+2)=3 bricks
    return 0
  return _solution(n)

【讨论】:

  • 是的,这实际上很聪明。虽然我认为 struct 参数不再需要了......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
相关资源
最近更新 更多