在矩阵动态编程中找到具有最大总和的行

时间:2016-06-17 18:44:34

标签: matrix dynamic-programming

我有一个矩阵,我必须找到总和最大的行。算法应该使用动态编程。

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

数字需要直接或对角连接。 我的想法是搜索每一行中的最大数字,并检查它是否直接或对角连接到下一行的最大数字。如果不是,我回去,拿下一个较小的号码再检查一下。但我注意到我的想法不是使用动态编程。这是我唯一的想法。

我希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

我提到这种dp方法,但可以进一步优化:

让给定的数组为:

a11 ... a1n
.
.
. 
am1 ... amn

和解决方案是:

s11 ... s1n
.
.
. 
sm1 ... smn

您可以从第一行开始并找到soln。对于该行中的每个元素。这是你的琐碎案例,ans与第1行相同。

s11 = a11
..
s1n = a1n

现在排第二。

s21 = max(s11, s12) + a21;
s22 = max(s11, s12, s13) + a22;
s23 = max(s12, s13, s14) + a23;
.
.

现在一般情况:

s[m][n] = max(s[m-1][n-1], s[m-1][n], s[m-1][n+1]) + a[m][n];

想法是跟踪在特定元素a [x] [y]上结束的ans。现在它只能从[x-1] [y-1]或[x-1] [y]或[x-1] [y + 1]到达。