【问题标题】:Fill the matrix with 2x1 tiles and minimize left spaces用 2x1 块填充矩阵并最小化剩余空间
【发布时间】:2019-11-19 22:37:04
【问题描述】:

我给出了一个大小为 5xN 的矩阵,其中很少有单元格被阻塞,我需要使用大小为 1x2 的图块填充矩阵,以使剩余的空单元格最少可能的。我们可以水平或垂直放置 1x2 瓷砖。 如果我在 cell(i,j) 处垂直放置瓷砖,那么我必须打印 1 (i,j) 否则打印 2 (i,j)强>。请看下面的例子:

......
..#..#
##.#..             # -> blocked cells
##.##.             . -> empty cells
.####.

上述矩阵的解决方案是:

2 (0,0) 
2 (0,2)
2 (0,4)
2 (1,0)
2 (1,3)
1 (2,2)
2 (2,4)
1 (3,5)

最终矩阵:

######
######         (only one cell left empty)
######             
######             
.#####

我尝试使用 BFS 解决,但它给了我时间限制,我可以使用什么其他方法来最佳地解决这个问题。

1

【问题讨论】:

  • 假设,对于第 i 行中 2^5=32 个可能的占用/空闲单元格模式中的每一个,您知道通过放置多米诺骨牌可以填充的最大单元格总数,因此 ( a)他们在第 i 行产生这种模式,并且(b)没有多米诺骨牌延伸到第 i 行下方。现在,对于第 i+1 行中任何给定的占用/空闲单元格模式,您可以通过尝试扩展每个第 i 行模式的所有方法来计算遵守第 i+1 行相应约束的占用单元格的最大总数。同样对于有 2 个间隙的第 i 行模式,您只需尝试=|| 形状之一。

标签: algorithm dynamic-programming breadth-first-search


【解决方案1】:

您可以在 O(N) 时间和空间内使用蛮力和动态编程的组合来解决这个问题。

为了解释这一点,我将把强加于 5 个单元格的列上的规则表示为二进制数 b(例如 10011),其中 >"1" 表示我将水平图块的左侧部分放在该单元格上,"0" 表示我没有。

现在,您可以定义一个大小为 (N+1)*32 的 DP 表,如下所示:

  • DP[i][b] 是如果列号 i 遵守所表示的规则,则前 i 列中空单元格的最小可能数量b。如果在此列上无法遵守规则 b(因为输入矩阵中的障碍物,或者因为我们位于矩阵的最后一列,因此无法放置水平图块),那么DP[i][b] = 无穷大

作为基本情况,您有 DP[0][0] = 0DP[0][b] = infinity 因为我无法使用0 列。

然后为 i>0 计算 DP[i][b],对于列 i 上的每个规则 b' -1 与列 i 上的规则 b 兼容,您计算以下内容:

  • DP[i-1][b'] + 如果您遵守规则 bi 上的空单元格数b' 然后在 i 列上放置尽可能多的垂直图块。

并将 DP[i][b] 设置为所有此类计算数字中的最小值。 (当然,如果 i 列上的规则 b 与输入矩阵中的障碍物不兼容,则只需设置 DP[i][b]无穷大)。

一旦你计算了所有这些值(按 i 的递增顺序),你的答案将是 DP[n][0](因为你不能放任何最后一列的水平图块)。

【讨论】:

  • 正确的想法,但如果“兼容”的意思是“在第 i 行有 1 的地方,第 i-1 行中有一个 0”,这可能会低估空单元格:例如您将设置 DP[i][10000] = min(..., DP[i-1][00111], ...) + 0,如果 DP[i-1][00111] 赢得该最小值,则会低估, 因为即使第 i-1 行可以通过放置水平多米诺骨牌来完全填充,一旦我们放置第 i 行 10000 所需的垂直多米诺骨牌,就不能再放置。
  • 使用 2 个单独的 DP 矩阵解决了这个问题:一个包含放置水平多米诺骨牌的效果(使用它在第 n 行获得最终答案)和一个不包含(使用它来计算下一个第一个 DP 矩阵的行)。另外,请提及最初的障碍。
  • 我认为我不同意您的评论(如果我理解正确的话),因为我将在 i 行上放置垂直平铺定义为放置i 行上的平铺(因此不可能干扰前一行的水平平铺)。我刚刚看到你对这个问题的评论,你似乎在做相反的事情,所以这可能是造成混乱的根源。
  • 至于最初的障碍,这就是我说“如果第 i 行的规则 b 与您的矩阵不兼容”时的意思,但可能不够清楚,我会尝试改写。
  • @Tassle 你可以为这个测试用例试运行吗 - ideone.com/Wd6DPG,答案应该是 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2018-11-11
  • 2015-04-14
  • 2013-03-12
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多