Algorithm 用2x1瓷砖填充矩阵,并最小化剩余空间
我已经给出了一个大小为5xN的矩阵,其中有几个单元格被阻塞,我需要使用大小为1x2的分片填充矩阵,以使剩余的空单元格尽可能少。我们可以水平或垂直放置1x2瓷砖。 如果我在单元格(I,j)垂直放置瓷砖,那么我必须打印1(I,j)否则打印2(I,j)。请参见下面的示例: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
......
..#..#
##.#.. # -> 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[i-1][b']+列i上的空单元格数如果您遵守规则b和b',则在列i上放置尽可能多的垂直平铺
计算完所有这些值后(按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