【发布时间】: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