动态编程任务/计数问题

时间:2013-08-07 18:22:09

标签: algorithm recursion dynamic-programming

我正在努力完成一项无法解决的动态编程任务。当你被要求计算解决方案的数量时,我在一本书中发现了一个类似的问题,它说这是一个计数问题,而不是优化问题,这很明显。我想知道如何处理这类任务,我想知道是否有一般的方法。我想知道这里的递归关系以及哪些是子问题。这是问题所在:

您可以在n个地方放置立方体。最少三个连续立方体被视为一个数字。数字至少分开一个地方。系统会要求您计算所有可以将数字放在自由位置的方法。这是n = 7的解决方案。蓝色方块表示放置立方体的自由位置,红色方块表示立方体。方式数等于17。

2 个答案:

答案 0 :(得分:2)

@saeedn几乎拥有它,但他的递归公式并不完全正确,因为它有一些遗漏的情况和一些重复计数。

让我们来看看第一个地方的可能性,要么它是一个空间(单个空间),要么就是那里有一个数字。图的长度可以是3,4,...,n-1,n。
如果它小于n,我们还需要在下一个数字之前添加“填充”(以避免重复计算),所以如果我们有3个立方体的数字,它就有{{1}不同的可能性(前3个单元格是立方体)。 f(n-4)个节点的数字是一个例外,因为我们无法在其后添加“填充”。

另一种可能性是单个空格,如果有更多空格,递归将在以后处理它。

这为我们提供了以下递归公式:

n

因此,如果我们将此公式暗示为DP算法,我们将得到:

f(0) = f(1) = f(2) = 1 (base)
f(n) = f(n-4) + f(n-5) + ... + f(1) + f(0) +   f(0)      + f(n-1)
         ^        ^             ^       ^       ^             ^
         3        4             n-2     n-1      n           space
       cubes    cubes          cubes    cubes   cubes
         +         +             +       +        +
        space    space         space    space   space   

答案 1 :(得分:0)

为了在这些问题中找到递归关系,你应该考虑一个可能的位置,比如在你的地方的开头,并看看你如何看到其他地方像一个问题,如初始的,但与尺寸较小。

例如在这个问题中,从左边开始,你可以将一个数字放在数字1,2,...,nL(其中L是图的大小),并将其余的空格处理到右边该数字(不包括一个分隔空间)与较小尺寸的相同问题。

如果我们想要制定递归,我们可以像这样写:

F(n)= sum [L = 3到n](和[p = 0到n-L](F(n-p-L-1)))

其中L迭代图形大小,p迭代放置该图形的位置(从左开始)。

有关详细说明:

(putting figure of size of 3)
###---- (we spent 3 spaces and reserve one space for separator,
         thus we have n-4 spaces which can be filled in F(n-4) ways)
-###--- (putting the figure in next available space => F(n-5) for the rest)
...
----###

(now putting figure of size 4)
####--- (F(n-(4+1)) = F(n-5) ways for empty spaces)
...

(and so on)