考虑一个二维m * n网格,其中每个单元格可以包含1或0.找到遍历可以通过移动此网格获得的最大值。通过对角穿过1个细胞可以增加该值。遍历网格遵循以下规则:
天真算法会考虑所有3 * m * n个遍历并选择最大值。有人可以帮我提出更好的解决方案吗?是否有解决类似问题的算法?
这不是一个面试问题,我需要这个来尝试优化Smith-Waterman算法。
以下网格的最大值为2:
这个最大值为7:
答案 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