【发布时间】:2015-11-14 20:43:59
【问题描述】:
我在采访中遇到了这个问题,无法弄清楚。我相信它有一个动态编程解决方案,但它让我望而却步。
给定一些砖块,输出可能的二维金字塔的总数,其中金字塔被定义为任何结构,其中一排砖块的砖块数量少于其下方的一排砖块。您不必使用所有积木。
砖只是一个正方形,一排砖的数量是唯一重要的信息。
真的坚持这个,我认为迭代解决每个问题 1...n 并求和会很容易。但是用 i 块砖计算出可能的金字塔数量让我望而却步。
例如,n = 6
X
XX
X
XX XXX
X
XXX XXXX
XX X
XXX XXXX XXXXX
X
XX XX X
XXX XXXX XXXXX XXXXXX
所以答案是 6 块砖有 13 个可能的金字塔。
编辑
我很肯定这是一个动态编程问题,因为(一旦您确定了第一行)只需查看您记忆的剩余砖块数组中的索引,看看有多少金字塔适合顶部是有意义的。
考虑宽度至少为 n/2 的底部行也是有意义的,因为我们顶部不能有比底部行更多的砖块除了,这就是我失去它和我的想法的地方分崩离析,在某些(少数情况下)你可以即N = 10
X
XX
XXX
XXXX
现在底行有 4 个,但顶部还剩下 6 个
但是在 n = 11 的情况下,我们不能有少于 n/2 个砖块的底行。还有另一个奇怪的不一致,比如 n = 4,我们不能有 n/2 = 2 块的底行。
【问题讨论】:
-
如果你不必使用所有的积木——使用 0 块积木可以吗?那么 - 为什么不是 14 个合法的金字塔 n = 6?
-
不确定,我不太记得问题陈述,但我认为最好将金字塔的定义限制在至少一块砖上。好电话我没有在问题陈述中提到这一点。
-
听起来非常适合递归函数。对于任何组合/排列问题,我首先会考虑递归而不是动态编程。
-
你的陈述“一旦你考虑第一行,找出你可以在上面建造多少金字塔”是一个递归陈述
-
记忆是一种优化。当您仍处于设计算法的阶段时,请忘记它。
标签: algorithm dynamic-programming