使用 2x1 和 1x2 多米诺骨牌平铺具有禁止位置的 2xN 网格的方法数量
Number of ways to tile a 2xN grid with forbidden positions with 2x1 and 1x2 dominoes?
我很想知道解决这个问题的算法。问题陈述的正式描述是这样的 - 给定 N(<100) 和多米诺骨牌 2x1 和 1x2,我必须找到可能的不同网格平铺的数量。这里的区别在于,某些单元格将被涂黑以表示禁止的位置。
Input:
5
01000
00010
Output:
1
输入中的 0 表示一个空单元格和 1 个禁止单元格。我在这里发现了一个类似的问题 六边形网格平铺 .虽然稍微提到了使用位掩码的动态编程解决这类问题,但我无法找到有关此技术的任何详尽解释。
PS:虽然我知道如何解决一般的网格平铺问题,但只有在这个问题中,只有当我们只得到空单元格时,才能形成重复,因为 F(n) = F(n-1) + F(n-2),通过放置一张 1x2 多米诺骨牌或放置两个 2x1 多米诺骨牌分别覆盖第一列和前两列。这可以迭代解决,甚至对于大 N(>比如 10^7),我们可以使用矩阵幂技术。但我有兴趣了解通过DP +位掩码解决此类问题的技术。任何帮助将不胜感激。
对于 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 列包含 1,1,则从第 i 列填充的组合数"
显然,f00 (n) = f11 (n) =1, f01 (n) = f10 (n) = 0。
f00 (i) 如果 i
f10 (i) for i
F01 (i) 的工作原理相同。
F11 (i) = f00、f01、f10 或 f11 (i + 1),具体取决于下一列中的内容。
线性时间很容易找到解决方案。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用 2x1 和 1x2 多米诺骨牌平铺具有禁止位置的 2xN 网格的方法数量