给定二进制矩阵(值为0或1),相邻的1表示“丘陵”。另外,给定一些数字
k
,找到您需要“翻转”为1的最小数量0,以便形成至少大小为k
的小山。
编辑:为了澄清,相邻意味着左右上下社区。对角线不计为相邻对象。例如,
[0 1
0 1]
是一个2号山,
[0 1
1 0]
定义了2个大小为1的山丘,
[0 1
1 1]
定义1个大小为3的小山,
[1 1
1 1]
定义了1个4号山丘。
另外,为了澄清,尺寸是由相邻的1b团形成的区域定义的。
我的初始解决方案涉及将每个现有山丘转换为图形的节点,并将成本作为到达每个其他节点的最小路径。然后,执行DFS(或类似算法)以找到最低成本。
如果选择某条路径可以降低另一条边的成本,那么就会失败,而解决这个问题的方法(我能想到的)与蛮力解决方案太接近了。
答案 0 :(得分:3)
您的问题与rectilinear Steiner tree problem密切相关。
Steiner tree使用线段将一组点连接在一起,从而使线段的总长度最小。线段可以在任意位置相遇,而不必在集合中的点相遇(因此与minimum spanning tree不同)。例如,给定等边三角形角处的三个点,欧氏Steiner树通过在中间相遇来连接它们:
直线Steiner树是相同的,只是您将总Manhattan distance而不是总欧几里德距离最小化。
在您的问题中,不是将山丘与以欧几里德距离测量长度的线段连接起来,而是通过添加像素来连接山丘。连接数组中的两个单元所需翻转的总数为0,等于两个单元之间的曼哈顿距离,减去1。
直线斯坦纳树问题is known to be NP-complete,即使仅限于具有整数坐标的点。您的问题是一个概括,除了两个不同之处:
这意味着您的问题可能不是NP难题,这取决于直线Steiner树问题是weakly NP-complete还是strongly NP-complete。在文献中,我找不到确切的答案,除了学术文献之外,关于该问题的信息很少。据我所知,至少确实没有一种已知的伪多项式时间算法。
鉴于此,您最可能的选择是使用backtracking search来获得确切的解决方案,或者应用试探法以获得“足够好”的解决方案。一种可能的启发式方法as described by Wikipedia是计算rectilinear minimum spanning tree,然后尝试使用iterative improvement method改进RMST。 RMST本身可以在真正最佳值的1.5的恒定因子内提供解决方案。
答案 1 :(得分:0)