【问题标题】:Number of combinations for 4xN domino bricks4xN 多米诺砖的组合数
【发布时间】:2012-05-30 11:20:00
【问题描述】:

我想找出 4 x N 区域(4 个单位宽度和 N 个单位高度,N ≥ 1)的多米诺砖使用动态编程的可能不同组合的数量。

多米诺砖的大小为 2x1,例如

==

对于水平和

|
|

对于垂直砖。

现在,

示例 4x1(两块多米诺骨牌并排)

====

4x2 积木配置示例(共 5 个)

1)

||||
||||

2)(转动右边的两块砖)

||==
||==

3)

|==|
|==|

4)

====
====

5)

==||
==|| 

目前已知的唯一组合数

4x1 : 1 possibility
4x2 : 5 possibilites
4x3 : 11 possibilites
4x4 : 36 possibilites

【问题讨论】:

  • 有一个简单的重复/生成函数。为什么动态规划如此重要?这是作业吗?
  • 是的,我不知道如何解决这个问题。
  • oeis.org/A005178 为此给出了一个 O(1) 公式:a(n)=((5*sqrt(29))/145)*(((1+sqrt(29)+sqrt(14+2*sqrt(29)))/4)^n+((1+sqrt(29)-sqrt(14+2*sqrt(29)))/4)^n-((1-sqrt(29)+sqrt(14-2*sqrt(29)))/4)^n-((1-sqrt(29)-sqrt(14-2*sqrt(29)))/4)^n) 祝你好运,不过可以向你的老师解释:)
  • @BlueRaja-DannyPflughoeft 因为a(n)Θ(n) 位数,所以只要double 精度足够,就只有O(1)
  • 我更喜欢递归公式a(n) = a(n-1)+5*a(n-2)+a(n-3)-a(n-4);通过编写一个合适的矩阵,你应该得到 O(log n)。我猜O(1)公式是通过矩阵对角化得到的。

标签: algorithm dynamic-programming


【解决方案1】:
F[n] = number of ways to tile a 4-by-n grid
G[n] = number of ways to tile a 4-by-n grid with top-right and bottom-right
    squares uncovered
H[n] = number of ways to tile a 4-by-n grid with bottom-right 2
        squares uncovered
  = number of ways to tile a 4-by-n grid with top-right 2
        squares uncovered
if n >= 2, the right end of any tiling can be
    two vertical dominoes (F[n-1] ways)
    horz, horz vert (H[n-1] ways)
    horz, vert, horz (G[n-1] ways)
    vert, horz, horz (H[n-1] ways)
    4 horizontal dominoes (F[n-2] ways)
 F[n] = F[n-1] + G[n-1] + 2*H[n-1] + F[n-2];
 For G: the right end can be a vertical domino (F[n-1] ways)
        or two horizontal dominoes => top & bottom are horz = G[n-2]
        G[n] = F[n-1] + G[n-2];
 For H: the right end can be a vertical domino (F[n-1] ways)
        or two horizontal dominoes (H[n-1] ways)
        H[n] = F[n-1] + H[n-1];
 F[0] = 1, F[1] = 1, G[0] = 0, G[1] = 1, H[0] = 0, H[1] = 1

希望对你有帮助!!

【讨论】:

    【解决方案2】:

    解决一个更普遍的问题。找出平铺 4×N 网格的方法数,其中顶行中的某些位置可能已被占用。将每个位置与 2 的幂相关联,最左边对应 1,第二个 2,第三个 4,最右边 8。设 T(N,k) 为 4×N 网格的平铺数,其中与顶行中的k 对应的位置已经被占用。 k == 0 表示没有位置被占用,k == 6 表示中间两个位置被占用(6 = 2 + 4)等等。

    然后找到转换,当填充顶行的其余部分时,下一行中的哪些模式可以通过多少种方式到达?

    例如,如果中间的两个位置都被占据了,那么填充顶行剩余部分的唯一方法是在最左边和最右边的位置垂直放置一个多米诺骨牌,导致

    |xx|
    |  |
    

    以及下一行最外面的两个位置被占用的配置,对应1+8 = 9,所以T(N,6) = T(N-1,9)。而对于k == 9,我们开始的情况看起来

    |  |
    

    我们有两种可能,

    |==|     ||||
              ||
    

    我们可以通过水平放置一个多米诺骨牌来填补空白,让下一行完全空闲,或者垂直放置两个多米诺骨牌,占据下一行的两个中间位置,所以

    T(N,9) = T(N-1,0) + T(N-1,6)
    

    使用这些转换来构建T(n,k) 的表。

    您要查找的值是T(N,0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多