遍历网格的算法收集尽可能多的点

时间:2014-03-09 03:30:01

标签: algorithm math graph-algorithm discrete-mathematics dna-sequence

考虑一个二维m * n网格,其中每个单元格可以包含1或0.找到遍历可以通过移动此网格获得的最大值。通过对角穿过1个细胞可以增加该值。遍历网格遵循以下规则:

  1. 从左上角的单元格开始。
  2. 在每个单元格中,遍历可以向下移动一个网格,向右移动一个网格,或者沿对角线移动(向下移动一个网格并向右移动一个网格)。如果单元格包含1并且遍历沿对角线移动,那么遍历值将增加1。
  3. 遍历无法离开网格(如果右边缘无法向右移动,如果底部边缘无法向下移动)。
  4. 在右下角结束。
  5. 天真算法会考虑所有3 * m * n个遍历并选择最大值。有人可以帮我提出更好的解决方案吗?是否有解决类似问题的算法?

    这不是一个面试问题,我需要这个来尝试优化Smith-Waterman算法。

    示例:

    以下网格的最大值为2:

    enter image description here

    这个最大值为7:

    enter image description here

3 个答案:

答案 0 :(得分:3)

使用动态编程:

dp[i, j] = maximum value obtainable from [1, 1] to [i, j]
dp[1, _] = dp[_, 1] = 0 -> we cannot get to any of these diagonally
dp[i, j] = max(dp[i - 1, j], -> come from above
i, j > 1       dp[i, j - 1], -> come from the left
               dp[i - 1, j - 1] + v[i, j] -> come diagonally and add what is at [i, j]
              )

答案将在dp[m, n]

复杂度为O(n*m),这是最优的,因为只需读取输入即可。

注意:

  

天真算法会考虑所有3 * m * n个遍历并选择最大值

这实际上应该是3 to the power of (n*m),因为对于每个单元格,如果你粗暴地强迫它,你将有3种可能性。

答案 1 :(得分:0)

可能有一种方法可以递归分支在对角线上行进并智能地仅修剪最高值,但这种方法过于复杂。

我问这个问题是可并行化的Smith-Waterman算法,最后我将使用这个http://biochem218.stanford.edu/Projects%202002/Byang.pdf

答案 2 :(得分:0)

您的问题可能转化为图形问题,其中顶点表示您的单元格,边缘表示相邻单元格或对角线相邻单元格之间的可能连接。

你所有的边都有权重0,除了那些代表从1个单元格开始的对角线旅行。

您现在已将问题转换为有向无环图(DAG)上的最长路径问题。这相当于在负等效权重的DAG上求解最短路径问题(即权重为1的所有边均变为权重-1)

对于负重的DAG中的最短路径,请使用Bellman-Ford算法。 http://en.wikipedia.org/wiki/Bellman-Ford_algorithm