任一一个矩阵和
const matrix = [[0], [1]];
function total(mx, dy, dx, dy1, dx1) {
const m = mx.length;
const n = mx[0].length;
const sums = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
if (m > 0) {
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
sums[i + 1][j + 1] = sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + mx[i][j];
//就基础的打表就行了
}
}
}
return sums[dy1 + 1][dx1 + 1] - sums[dy][dx1 + 1] - sums[dy1 + 1][dx] + sums[dy][dx];
}
console.log(total(matrix, 0, 0, 1, 0));
指定矩阵和
const matrix = [[1, 0, 1, 1], [0, -2, 3, 1], [3, 4, 5, 1], [1, 1, 1, 1]];
const k = 2000;
let ans = -Infinity;
const m = matrix.length; const
n = matrix[0].length;
for (let i = 0; i < m; ++i) {
const sum = new Array(n).fill(0);
for (let j = i; j < m; ++j) {
for (let t = 0; t < n; ++t) {
sum[t] += matrix[j][t];
// sum【t】就是列之和
}
// console.log(sum);
// sum就是在矩形上下位置不一样的条件下的列之和的数组 里面的每一个值代表仅仅当前位置的列
// 此时就变成了一维数组去找它不超过k的最大子序和 这里可以使用贪心策略
let pre = 0;
let maxAns = sum[0];
for (const v of sum) {
pre = Math.max(pre + v, v);
maxAns = Math.max(maxAns, pre);
if (maxAns <= k) {
ans = Math.max(ans, maxAns);
}
}
}
}
console.log(ans);