Algorithm 动态规划-建造建筑物的方法数量

Algorithm 动态规划-建造建筑物的方法数量,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我正试图用动态规划来解决下面这类问题——我似乎找不到重复性。问题如下: “建筑是由至少两个街区组成的结构 你的任务是找到总的方法,这样所有的街区都可以用来建造建筑物 例如,对于n=5,答案是2,因为[5],[2,3] 对于n=6,答案是4,因为[6],[2,4],[2,2,2],[3,3]。” 有人能帮我理解如何自下而上或自上而下地做这件事吗?这与。让f[i][j]在大小不递减的块中确定i的分区数,以便最后一个块大小为j。那么,您的更新规则是: f[i+k][k] += f[i][j], for

我正试图用动态规划来解决下面这类问题——我似乎找不到重复性。问题如下:

“建筑是由至少两个街区组成的结构

你的任务是找到总的方法,这样所有的街区都可以用来建造建筑物

例如,对于n=5,答案是2,因为[5],[2,3]

对于n=6,答案是4,因为[6],[2,4],[2,2,2],[3,3]。”


有人能帮我理解如何自下而上或自上而下地做这件事吗?

这与。让
f[i][j]
在大小不递减的块中确定
i
的分区数,以便最后一个块大小为
j
。那么,您的更新规则是:

f[i+k][k] += f[i][j], for k>= max(2, j) // bottom-up approach
分区数的答案是:

f[n][2] + f[n][3] + ... + f[n][n]
或者,您可以使用自上而下的方法:

f[i][j] += f[i-k][k] for 2 <= k <= j

实际上有一个非常简单的解决方案:包含
1
n
分区的数量等于
(n-1)
分区的总数。考虑它的一种方法是想象从包含一个
n
的每个分区中删除一个
1
;任何不包含
1
n
分区都不能以这种方式进行转换

所以我们可以简单地从经典中去掉第一项,
p(k)=p(k)− 1) +p(k)− 2) − p(k)− 5) − p(k)− 7) +p(k)− 12) +p(k)− 15) − p(k)− 22) − ...,并派生:

p_without_1s(k) = p(k − 2) − p(k − 5) − p(k − 7) + p(k − 12) + p(k − 15) − p(k − 22) − ...


n
是什么意思?n是块数(1)动态规划有助于找到最佳解决方案,而不是扩展所有可能性。(2) 为什么5不是[5]、[1,4]、[1,1,3]、[1,1,1,2]、[1,1,1,1]、[2,3]、[2,1,2]的7个组合呢?这与“建筑是由结构形成的……”有什么关系?@KenCheung最小尺寸必须是2(而不是1),这不是正确答案,因为一座建筑应该由2个街区组成,所以[1,4]无效,因为第一项小于2
p_without_1s(k) = p(k − 2) − p(k − 5) − p(k − 7) + p(k − 12) + p(k − 15) − p(k − 22) − ...
p_without_1s(k) = p(k) - p(k - 1)