【问题标题】:Number of ways to tile a 2xN grid with forbidden positions with 2x1 and 1x2 dominoes?用 2x1 和 1x2 多米诺骨牌平铺 2xN 网格的方法有多少?
【发布时间】:2015-01-22 08:31:23
【问题描述】:

我很想知道解决这个问题的算法。问题陈述的正式描述是这样的——给定 N(

Input:
5
01000
00010

Output:
1

输入中的 0 代表一个空单元格和 1 个禁止单元格。 我在这里Hexagonal Grid Tiling 发现了一个类似的问题。尽管稍微提到了使用位掩码动态编程解决这类问题,但我无法找到有关该技术的任何详尽解释。

PS:虽然我知道如何解决一般的网格平铺问题,但在这个问题中,只有当我们只给出空单元格时,才能形成递归式 F(n) = F(n-1) + F (n-2),通过放置一个 1x2 多米诺骨牌或放置两个 2x1 多米诺骨牌分别覆盖第一列和前两列。这可以迭代解决,甚至对于大 N(比如 > 10^7),我们可以使用矩阵求幂技术。但我有兴趣了解 DP+Bitmasks 解决这类问题的技术。任何帮助将不胜感激。

【问题讨论】:

  • 有趣的问题,但我认为这在 stackexchange 网络上的数学站点之一上更合适。
  • 我会等待,如果我没有看到自己得到答案,我肯定会在那里发布。但是我觉得我在这里感兴趣的动态编程方面更多地属于 SO。即使 DP 的标签计数是 1362 >> 它在 Math SE (89) 中是什么 :)
  • 这个特殊问题可以使用 FKT 在多项式时间内解决任意网格。

标签: c++ algorithm dynamic-programming bitmask tiling


【解决方案1】:

对于 i = n, n-1, ..., 1 你计算 f00 (i) = "如果 i 列包含 0,0 则从 i 列填充的组合数", f01 (i) = "如果第 i 列包含 0,1,则从第 i 列填充的组合”,f10 (i) = “如果第 i 列包含 1,0,则从第 i 列填充的组合数”,f11 (i) = “从第 i 列填充的组合数第 i 列,如果第 i 列包含 1,1"

显然f00(n)=f11(n)=1,f01(n)=f10(n)=0。

f00 (i) if i

f10 (i) for i

f01 (i) 的工作原理相同。

f11 (i) = f00, f01, f10 或 f11 (i + 1) 取决于下一列的内容。

在线性时间内很容易找到解决方案。

【讨论】:

  • f10(i) for i
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多