Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 金字塔动态规划_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 金字塔动态规划

Algorithm 金字塔动态规划,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我在一次采访中遇到了这个问题,无法理解。我相信它有一个动态规划的解决方案,但它逃避我 给定砖块数量,输出可能的二维棱锥体总数,其中棱锥体定义为砖块行的砖块数严格小于其下一行的任何结构。你不必使用所有的砖头 一块砖就是一个正方形,一排砖的数量是唯一重要的信息 我真的很坚持这一点,我想它将很容易解决每个问题1…n迭代和总和。但是,用我的砖块计算出可能的金字塔的数量是在回避我 示例,n=6 X XX X XX XXX X XXX XXXX XX X XXX XXXX

我在一次采访中遇到了这个问题,无法理解。我相信它有一个动态规划的解决方案,但它逃避我

给定砖块数量,输出可能的二维棱锥体总数,其中棱锥体定义为砖块行的砖块数严格小于其下一行的任何结构。你不必使用所有的砖头

一块砖就是一个正方形,一排砖的数量是唯一重要的信息

我真的很坚持这一点,我想它将很容易解决每个问题1…n迭代和总和。但是,用我的砖块计算出可能的金字塔的数量是在回避我

示例,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</p>
X
XX
XXX
XXXX
现在最下面一行有4个,但还有6个放在上面


但是,如果n=11,则底部的一行砖数不能少于n/2。还有另一个类似于n=4的wierd不一致性,其中我们不能有底部一行n/2=2块砖。

有多少种方法可以构建一个宽度为n的金字塔?将任何宽度为n-1或更小的棱锥放置在n砖层的顶部。因此,如果p(n)是宽度为n的金字塔的数量,那么p(n)=和[m=1到n-1](p(m)*c(n,m)),其中c(n,m)是可以将宽度为m的层放置在宽度为n的层上的方法的数量(我相信你自己可以解决这个问题)


然而,这并不限制砖块的数量。通常,在DP中,任何资源限制都必须作为单独的维度建模。所以你现在的问题是p(n,b):“你能用总共b块砖建造多少个宽度为n的金字塔”?在递归公式中,对于在当前金字塔上构建较小金字塔的每种可能方式,您需要参考剩余砖块的正确数量。我把它作为一个挑战留给你们去解决递归公式;如果您需要任何提示,请告诉我。

您可以将您的递归想象为:给定最后一行使用的
n
砖块所剩的
x
砖块,您可以构建多少个金字塔。现在您可以从上到下或从下到上填充行。我将解释前一种情况。
这里的递归可能看起来像这样(
left
是剩余的砖块数,
last
是最后一行使用的砖块数)

因为当您在当前行上使用
i
砖块时,您将剩下
left-i
砖块,并且
i
将是此行使用的砖块数量

代码:

int-calc(int-left,int-last){
int-total=0;

如果(左让我们选择一个合适的定义:

f(n, m) = # pyramids out of n bricks with base of size < m
我们来分析一下:

  • 第一个是显而易见的:那是你的砖块数
  • 您的最下面一行最多包含
    N
    块(因为这就是您所拥有的全部),因此
    N+1
    是一个足够的下限
  • 最后,之所以存在
    -1
    ,是因为从技术上讲,空金字塔也是一个金字塔(因此将被计算),但您将其从解决方案中排除

基本情况很简单:

f(n, 0) = 1   for any n >= 0
f(0, m) = 1   for any m >= 0
在这两种情况下,我们计算的都是空金字塔


现在,我们所需要的仍然是一般情况下的递归公式

让我们假设我们得到
n
m
,并选择在底层有
i
砖。我们可以在这一层的顶部放置什么?一个较小的金字塔,我们剩下
n-i
砖,其底部有大小
。这正是
f(n-i,i)


<代码> > <代码>的范围是什么?我们可以选择一个空行,所以<代码> i>=0 < /代码>。很明显,<代码> i> p>因为我们被要求对小于或等于<代码> n>代码>的任何基数的金字塔进行计数,我们可以依次考虑每个基数(1元素、2元素、3……的金字塔)。但是我们可以用多少种不同的方式从
k
元素组成一个金字塔呢?与
k
的不同分区的计数相同(例如,对于
k=6
,我们可以有
(6)、(1,5)、(2,4)和(1,2,3)
).中描述了不同分区计数的生成函数/递归,并在中给出了一个序列

重复性,基于:

由于Wikipedia中描述的重复性要求计算所有前面的
q(n)
,以得到更大的
q(n)
,因此我们可以简单地将结果相加以获得结果

JavaScript代码:

函数numPyramids(n){
变量distinctPartitions=[1,1],
五边形={},
m=_m=1,
五边形_m=2,
结果=1;

而(五边形)m/2我没有考虑宽度(底行)作为一个尺寸。我只是想用n块砖来创建一些金字塔。例如,如果n=3,对于I=1,我们有一块单独的砖作为金字塔,对于I=2,我们有一行2,对于I=3,我们有(3)和(2,1)。我如何使用宽度作为约束?根据砖块的数量,宽度可能会改变。我很有信心,使用所有的n块砖块,我们可以在底部的n和n/2块砖块之间使用k,尽管我不知道如何证明。然后,对于每一块砖块,我们添加一个+我们可以在顶部使用n-k块建造的金字塔的数量。钻机ht轨道?@shane:我忘了提那件事,但事实上,你需要试试
f(n, m) = # pyramids out of n bricks with base of size < m
f(N, N+1) - 1
f(n, 0) = 1   for any n >= 0
f(0, m) = 1   for any m >= 0
f(n, m) = sum f(n - i, i) for 0 <= i <= min(n, m - 1)
f(N, N + k) = sum f(N - i, i) for 0 <= i <= min(N, N + k - 1)
            = sum f(N - i, i) for 0 <= i <= N
            = sum f(N - i, i) for 0 <= i <= min(N, N + 1 - 1)
q(k) = ak + q(k − 1) + q(k − 2) − q(k − 5) − q(k − 7) + q(k − 12) + q(k − 15) − q(k − 22)...
  where ak is (−1)^(abs(m)) if k = 3*m^2 − m for some integer m and is 0 otherwise.

(The subtracted coefficients are generalized pentagonal numbers.)