请在下面找到我当前的实现:
function findMaxSumSubMatrix(matrix) {
var dim = matrix[0].length;
// initialize prefix sum matrix
var ps = new Array();
for (var _ = 0; _ < dim; _++) {
ps[_] = new Array();
}
// calculate vertical prefix sum matrix
for (var i = 0; i < dim; i++) {
for (var j = 0; j < dim; j++) {
if (j == 0) {
ps[j][i] = matrix[j][i];
} else {
ps[j][i] = matrix[j][i] + ps[j - 1][i];
}
}
}
// console.log(ps); // log prefix sum matrix
var maxSum = 0;
var min, temp;
// using the prefix sum matrix, iterate over all combinations and keep track of the max (Kadane's algorithm)
for (var i = 0; i < dim; i++) {
for (var j = i; j < dim; j++) {
min = 0;
temp = 0;
for (var k = 0; k < dim; k++) {
if (i == 0) {
temp += ps[j][k];
} else {
temp += ps[j][k] - ps[i - 1][k];
}
if (temp < min) {
min = temp;
}
if (temp - min > maxSum) {
maxSum = temp - min;
}
}
}
}
return maxSum;
}
var example1 = [
[1, -61, 5126, 612, 6],
[41, 6, 7, 2, -7],
[1, 73, -62, 678, 1],
[7, -616136, 61, -83, 724],
[-151, 6247, 872, 2517, 8135],
];
console.log(findMaxSumSubMatrix(example1)); // expected output: 18589
这按预期工作,输出正确。
然而,我并没有完全自己编写代码。
我不清楚的是“min”和这部分:
if (temp < min) {
min = temp;
}
if (temp - min > maxSum) {
maxSum = temp - min;
}
有人可以向我解释那里发生了什么,为什么需要它?我尝试省略它,但结果不正确。
谢谢。
答案 0 :(得分:1)
将此视为一个简单的一维数组,您必须在其中找到最大的连续子序列和(正是 Kadane 算法所做的)。对于每个前缀和,您将考虑它前面的最低前缀和并计算差异(选择最低的,因为您需要最大化差异)。
同样,这里的二维数组也存储了前缀和。我们使用 min
来跟踪当前列中遇到的最低总和。由于我们需要最大和,我们尝试最大化当前前缀和(即 temp
)与遇到的最小和(即 min
)之间的差异。