@saeedn 几乎得到了它,但他的递归公式并不完全正确,因为它有一些缺失的情况和一些重复计算。
让我们首先检查一下可能性,要么是空间(单个空间),要么那里有一个图形。图形的长度可以是 3,4,...,n-1,n。
如果小于 then n
,我们还需要在下一个图形之前添加“填充”(以避免重复计算),所以如果我们有一个 3 个立方体的图形,它有f(n-4)
不同的可能性(前 3 个单元格是立方体)。一个例外是n
节点图,因为我们不能在它之后添加“填充”。
另一种可能性是单个空格,如果有更多空格,递归将在稍后处理它。
这给了我们以下递归公式:
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]