动态编程。 4xn矩阵,如何在O(n)中找到最大和

时间:2018-12-12 16:13:51

标签: dynamic-programming

我没有什么限制。我不能从共享边的单元格中选择值(对角线也可以)。我可以从每一列中选择多个元素。

例如。我有一个矩阵

1 3 6 10 3
4 2 6 7  9
5 1 8 3  3
9 2 9 1  1 

如果我选择1和5,首先我必须选择2和2,第二个是6和8,依此类推。

我能想出的最好方法是蛮力执行算法,但这是O(n ^ 4)任何想法吗? 我看过匈牙利算法,但是它在O(n)中也不起作用。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果矩阵限制为4 × n,我们可以运行一个动态程序。假设我们对任何列的选择只能是以下一种:

a) x  b) -  c) -  d) -
   -     x     -     -
   -     -     x     -
   -     -     -     x

e) x  f) -  g) x  h) -
   -     x     -     -
   x     -     -     -
   -     x     x     -

当我们为元素选择选择模式f(i, p)时,我们可以定义i代表直到第p列的最大和。然后:

f(i, a) = sum ith column elements pattern a + max(
  f(i - 1, b),
  f(i - 1, c),
  f(i - 1, d),
  f(i - 1, f),
  f(i - 1, h)
)

f(i, b) = sum ith column elements pattern b + max(
  f(i - 1, a),
  f(i - 1, c),
  f(i - 1, d),
  f(i - 1, e),
  f(i - 1, g),
  f(i - 1, h)
)

etc.

由于p仅限于8个选择,因此搜索空间为O(n * 8) = O(n)