Algorithm 具有2 x 1和2 x 2矩形的平铺网格

Algorithm 具有2 x 1和2 x 2矩形的平铺网格,algorithm,dynamic-programming,tiling,recurrence,Algorithm,Dynamic Programming,Tiling,Recurrence,我无法写出下面这样一个问题的递归关系 给定一个尺寸为4 x n的矩形网格,有多少种方法可以用2 x 2和2 x 1多米诺骨牌完全平铺网格 在这里,对于2x1矩形,它做得非常好,但我无法确定矩形是否为2x1和2x2: 有什么想法吗 例如 4x1:1路 4x2:11路 4x3:29路 下面的代码使用蛮力生成所有可能性。但我想用动态规划来做 在4xn中,n为偶数或奇数。如果n是偶数,只需使用2x2多米诺骨牌即可。否则,使用2x2直到n-1。然后使用两个2x1多米诺骨牌完成4x1剩余的块。在回答时,我没

我无法写出下面这样一个问题的递归关系

给定一个尺寸为4 x n的矩形网格,有多少种方法可以用2 x 2和2 x 1多米诺骨牌完全平铺网格

在这里,对于2x1矩形,它做得非常好,但我无法确定矩形是否为2x1和2x2:

有什么想法吗

例如

4x1:1路

4x2:11路

4x3:29路

下面的代码使用蛮力生成所有可能性。但我想用动态规划来做


4xn
中,
n
为偶数或奇数。如果
n
是偶数,只需使用
2x2
多米诺骨牌即可。否则,使用
2x2
直到
n-1
。然后使用两个
2x1
多米诺骨牌完成
4x1
剩余的块。在回答时,我没有跟随你的链接,因为我假设这个问题已经充分说明了,这个链接只是你对一个更简单问题的回答

n=偶数

use n 2x2 dominoes
n=奇数

use n-1 2x2 dominoes plus 2 2x1 domino
  • 如果n=10,则4*10=40和(2x2)*10=40

  • 如果n=11,则4*11=44和(2x2)*10=40和(2x1)*2=4,总计44


我认为您可以通过使用动态规划算法来解决这个问题

想象一下,不是将网格表示为4 x n的正方形网格,而是表示每个列宽度的4元组。每次放置瓷砖时,都可以尝试将其放置在某个位置,使其中一个正方形接触栅格最左侧的左上角。这样做的效果是更改每个列的有效宽度。例如,给定此4 x 3网格:

. . .
. . .
. . .
. . .
我们将其编码为(3,3,3,3)。如果在上角放置一个2 x 2的块,您将得到以下结果:

X X .
X X .
. . .
. . .
这将被编码为(1,1,3,3),因为最上面的两行实际上要小得多

这就提出了一种初始(低效)递归算法。作为您的基本情况,世界(0,0,0,0)只有一个解决方案(即不做任何事情)。任何一个没有合法方法放置覆盖最左边一行最上面正方形的瓷砖的世界都没有解决方案。否则,对于所有可能的移动,进行该移动,更新世界的内部表示,并递归地添加在较小世界中可以找到的所有解决方案

这是非常缓慢的(指数级),但可以大大加快。特别地,注意可能的4元组的数量是(n+1)4。这意味着唯一递归调用的最大数量为O(n4)。因此,如果记忆递归调用或使用动态编程向后计算调用,则只需进行多项式次数的调用。记忆应该很容易添加到现有的递归解决方案中,而且加速速度应该相当大

如果你在寻找一个更精确的数学方法来解决这个问题,试着为这个问题写出一个生成函数,并用它来导出一个封闭形式的解。一旦你有了它,直接评估它就不难了,比上面的解决方案要有效得多。因为我不是生成函数的专家,所以我不确定你是怎么做到的


希望这有帮助

其实有点不对。因为两者都可以使用。例如,2by2和2by1 domino可以一起使用。它使事情变得复杂。我添加了一个bruteforce代码示例,它还生成了所有可能的平铺,请看一看。