algorithm - 动态规划任务/计数问题

标签 algorithm recursion dynamic-programming

我正在为一个我无法解决的动态规划任务而苦苦挣扎。当你被要求计算解决方案的数量时,我在一本书中发现了一个类似的问题,它说这是一个计数问题而不是优化问题,这是显而易见的。我想要一个如何处理这类任务的建议,我想知道是否有一个通用的方法来解决这个问题。我想知道这里的递归关系以及哪些是子问题。这是问题所在:

你有 n 个地方可以放置你的立方体。至少三个连续的立方体被视为一个图形。数字至少由一位隔开。您需要计算所有可以将图形放置在空闲位置的方法。这是 n = 7 的解决方案。蓝色方 block 代表放置立方体的自由位置,红色方 block 代表立方体。路数等于 17。

最佳答案

@saeedn 几乎搞定了,但是他的递归公式不太正确,因为它有一些遗漏的情况和一些重复计算。

让我们检查一下第一个位置的可能性,要么是一个空格(单个空格),要么那里有一个图形。图的长度可以是 3,4,...,n-1,n。
如果小于n,我们还需要在下一个数字之前添加'padding'(避免重复计算),所以如果我们有一个3个立方体的数字,它有f(n-4) 不同的可能性(前 3 个单元格是立方体)。 n 节点的图是个异常(exception),因为我们不能在它后面添加“填充”。

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

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

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   

因此,如果我们将此公式隐含到 DP 算法中,我们将得到:

arr[n+1] = [0,0,...,0]
arr[0] = arr[1] = arr[2] = 1
for (int i = 3; i < n+1; i++) 
   for (int j = 0; j <= i - 4; j++)  //f(n-4) + f(n-5) + ... + f(1) + f(0)
      arr[i] += arr[j]
   arr[i] += arr[0] // extra one f(0) for a shape with i cubes
   arr[i] += arr[i-1] // space
return arr[n]

关于algorithm - 动态规划任务/计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18110870/

相关文章:

java - 如何平滑地每秒增加一个数字?

python - 递归重命名文件和文件夹

haskell - 如何使用 State Monad 和可变向量解决 Alphametics 难题?

algorithm - 如何找到选择 3 种类型的 k 个对象的方法数

c++ - 内存解决方案提供 TLE,而表格解决方案则不提供

algorithm - 如何从 map 转换MapResult!到整数数组?

c - 添加第一个学生的记录后它停止工作并且不会将数据保存在文件中

javascript - 如何使用 React 组件处理递归数组映射?

algorithm - 将一组项目公平地分成 3 个独立组的算法是什么?

python - 用函数变换集合的高效算法