我有一个矩阵,我必须找到总和最大的行。算法应该使用动态编程。
4 5 3 2 1
2 2 7 2 5
1 4 2 5 6
9 1 2 1 6
数字需要直接或对角连接。 我的想法是搜索每一行中的最大数字,并检查它是否直接或对角连接到下一行的最大数字。如果不是,我回去,拿下一个较小的号码再检查一下。但我注意到我的想法不是使用动态编程。这是我唯一的想法。
我希望你能帮助我。
答案 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]到达。