Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用2x1瓷砖填充矩阵,并最小化剩余空间_Algorithm_Dynamic Programming_Breadth First Search - Fatal编程技术网

Algorithm 用2x1瓷砖填充矩阵,并最小化剩余空间

Algorithm 用2x1瓷砖填充矩阵,并最小化剩余空间,algorithm,dynamic-programming,breadth-first-search,Algorithm,Dynamic Programming,Breadth First Search,我已经给出了一个大小为5xN的矩阵,其中有几个单元格被阻塞,我需要使用大小为1x2的分片填充矩阵,以使剩余的空单元格尽可能少。我们可以水平或垂直放置1x2瓷砖。 如果我在单元格(I,j)垂直放置瓷砖,那么我必须打印1(I,j)否则打印2(I,j)。请参见下面的示例: ...... ..#..# ##.#.. # -> blocked cells ##.##. . -> empty cells .####. 上述矩阵的解决方案为: 2

我已经给出了一个大小为5xN的矩阵,其中有几个单元格被阻塞,我需要使用大小为1x2的分片填充矩阵,以使剩余的空单元格尽可能少。我们可以水平或垂直放置1x2瓷砖。 如果我在单元格(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您可以使用蛮力和动态规划的混合,在时间和空间中解决这个问题

为了解释这一点,我将把施加在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-1列上与i列上规则b兼容的每个规则b',计算如下:

  • DP[i-1][b']+列i上的空单元格数如果您遵守规则bb',则在列i上放置尽可能多的垂直平铺
并将DP[i][b]设置为所有此类计算数字中的最小值。(当然,如果列i上的规则b与输入矩阵中的障碍不兼容,则只需将DP[i][b]设置为无穷大即可)


计算完所有这些值后(按i的递增顺序),您的答案将是DP[n][0](因为您不能在最后一列上放置任何水平平铺)。

假设,对于第i行中2^5=32个可能的占用/空闲单元格模式,您知道通过放置多米诺骨牌可以填充的最大单元格总数,以便(a)它们在第一行中生成此模式,以及(b)多米诺骨牌不会延伸到第一行下方。现在,对于第i+1行中任何给定的占用/空闲单元模式,您可以通过尝试扩展每个第i行模式的所有方法来计算遵守第i+1行相应约束的最大占用单元总数。同样,对于同时具有两个间隙的行i模式,您只需尝试其中一种
=
|
形状。正确的想法是,如果“兼容”意味着“行i-1中有一个0,而行i中有一个1”,这可能会低估空单元格:例如,您可以设置DP[i][10000]=min(…,DP[i-1][00111],…)+0,如果DP[i-1][00111]赢得该最小值,这将低估,因为即使通过放置水平多米诺骨牌可以完全填充第i-1行,但一旦我们放置第i行的10000所需的垂直多米诺骨牌,就无法再放置该行。使用两个单独的DP矩阵可以解决这一问题:一个矩阵包含放置水平多米诺骨牌的效果(使用此选项获得第n行的最终答案)和不使用此选项的答案(使用此选项计算第一个DP矩阵的下一行)。此外,请提及初始障碍。我认为我不同意您的评论(如果我理解正确),因为我将在第I行放置垂直瓷砖定义为在第I行放置瓷砖的上部(因此,不可能干扰前一行的水平分幅)。我刚才看到你对问题的评论,你似乎是从另一个角度来做的,所以这可能是混乱的根源。至于最初的障碍,这就是我所说的“如果第一行的规则b与你的矩阵不兼容”,但它可能不够清楚,我将尝试重新表述它。@Tassle您能试着运行这个测试用例吗-,答案应该是1