找到最小数量的水平线和垂直线,将1与其他1分开?

时间:2017-05-31 18:32:09

标签: algorithm math matrix grid time-complexity

我有2行和n列。 我必须找到将1与其他1分开所需的最小行数。例如:

设n = 6

0 0 1 0 1 1
1 0 0 1 0 1

我需要在这两行之间画一条水平线。 索引之后的2条垂直线(从0开始)2,在索引4之后直到底部。

总线数= 1 + 2 = 3.

注意,行可以是任意长度,即它可以是一列的长度,但行数应该是最小的,每个1(矩阵的数量)应该与其他1分开。

另一个澄清这一点的例子:

设n = 7

1 0 1 0 0 1 1
0 1 0 0 1 0 0

在这个例子中,我需要1条水平线和2条垂直线。 索引1之后的一条垂直线和索引5之后的另一条垂直线(长度等于列的行)。

总线数= 1 + 2 = 3.

请为我提供时间复杂度最低的解决方案。

1 个答案:

答案 0 :(得分:1)

似乎水平线是最佳解决方案的一部分,每当两行至少有一个1时(也有最佳解决方案只有垂直线的情况,但你总是可以切换其中一个垂直线水平线)。因此我们可以将其视为给定(另一种情况易于检测且易于解决)。

然后,你真的没有多少选项可以放置多少行。这使得它很容易解决。从左到右同时遍历行。每当遇到1时,检查是否需要放线。这是一些伪代码:

topRowHas1 := false
bottomRowHas1 := false
lines := 1  //the horizontal line
for location from 0 to n - 1 (inclusive)
    if (topRow[location] == 1 && topRowHas1) || (bottomRow[location] == 1 && bottomRowHas1)
        //we have to add a vertical line
        lines++
        topRowHas1 := false
        bottomRowHas1 := false
    end if
    topRowHas1 |= topRow[location] == 1
    bottomRowHas1 |= bottomRow[location] == 1
next

这是你的例子的执行

0 0 1 0 1 1
1 0 0 1 0 1

location  topRowHas1  bottomRowHas1  lines
------------------------------------------
              false       false        1
     0        false       true         1
     1        false       true         1
     2        true        true         1
     3        false       false        2  //vertical line here
              false       true         2
     4        true        true         2
     5        false       false        3  //vertical line here
              true        true         3

所以我们有一条水平线,一条在位置3之前的垂直线,一条垂直线在位置5之前。