最大化矩阵中的特殊元素

时间:2013-08-23 16:53:48

标签: algorithm matrix

以下是问题陈述:

矩阵的大小为m * n 所有数字从1到m * n占据其中的一个位置。现在,如果(递归定义)

元素称为特殊元素
-it is the top left corner element(at position (0,0)) 
-an element at (x,y) is special if its neighbour is an element (m,n) such that (m,n) is    
 special and the element at (x,y) is greater than the element at(m,n) and all of the (m,n)'s neighbours.

单元格的邻居是与其共享边缘的单元格。因此,内部单元有4个邻居,边缘单元有3个邻居,角单元有2个邻居。

问题表明矩阵中只有少数(可能是0个)单元格已被填充。 其余部分应以这样的方式填充,即使用从1到m * n的所有数字,并且我们最大化特殊元素的数量。此外,如果可能有多个答案,按字典顺序排列的最小矩阵将被视为答案。

如果矩阵的行 - 主视图的字符串在字典上小于另一个,则矩阵在字典上比另一个矩阵小。

Test case 1: //2 X 3 matrix
2 ? ? 
? ? 3 

Solution 1:
2 1 4 
5 6 3 

Test case 2: //6 X 6 matrix
? ? ? ? ? ? 
? ? ? ? ? ? 
? ? ? ? ? ? 
? ? ? ? ? ? 
? ? ? ? ? ? 
? ? ? ? ? ? 

Solution 2:
 1  2  3 13 14 15 
 4  6  8 10 11 16 
 5  7  9 12 19 17 
28 26 24 22 20 18 
29 27 25 23 21 36 
30 31 32 33 34 35

我的逻辑: 矩阵中的特殊元素始终是连续的。因此,我们必须找出通过连接连续的特殊元素形成的最长的这种路径。此外,在将元素放置在特殊元素(m,n)的相邻单元格(x,y)之前,我们首先填写特殊元素(m,n)的所有邻居(除了(x,y))和然后选择一个大于所有值的值来填充(x,y)。

我不知道如何继续前进以及如何包含按字典顺序排列的最小条件。请帮忙。

提前致谢。

1 个答案:

答案 0 :(得分:1)

最好的解决方案是找到解决问题的算法,并证明它是正确的。缺乏这一点,还有更多的选择。

回溯

这是一个组合问题,您可以使用backtracking解决此问题。成功实现回溯算法以解决问题所需的关键点是:

  1. 为下一步找到一个好的启发式
  2. 找到一个好的早期停止启发式,分支和绑定
  3. 我会这样解决:

    • 找到可以放置下一个特殊元素的所有可能位置。正如你所指出的那样,不会有很多这样的地方。
    • 选择可用于添加下一个特殊值的所有可能值组合,而不考虑回溯中的后续步骤。跟踪哪些数字仍然存在以及哪些数字通常是"和每个步骤的特殊值(通过使用递归或通过创建定制的数据模型)。矩阵的其余部分可以留空(或0),以便在回溯中进一步填充。对可能性进行排序,以便首先提供按字典顺序排列的较小解决方案。尝试所有可行的可能性。
    • 如果没有留下特殊值,请按字典顺序填写矩阵中的空白点,这也是一项要求。

    当您放置 k 特殊值 i 时,可以提前停止,这样您就无法做到比当前最好的更好解。当然,如果不能添加更多特殊值,您还必须停止分支。像你提出的那样创建一个初始解决方案将是一个良好的开端,并且允许更多的分支切割而不是冷启动。

    或许还有一点猜测......

    即使经过优化,也许回溯太慢,因为它试图找到所有可能的解决方案。另一种方法是使用heuristic algorithm,例如genetic algorithmstabu searchvariable neighborhood searchsimulated annealing,...

    此类算法可能会快速找到可行的解决方案,但在不利方面,该解决方案可能不是最佳解决方案。