动态规划+压缩数组 数组子矩阵累加和最大值

182 阅读1分钟

题目

给定一个矩阵,求子矩阵的累加和最大值

  • 矩阵遍历规则为按行区域遍历,以0行为起点,遍历剩余区域,以1行为起点遍历剩余区域,...
  • 对于每一行的累加和最大值,就是通过子数组累加和最大值的方法去求子数组累加和最大值,对于0-1行,压缩数组,把第0行和第1行的元素按列相加,再求数组累加和最大值,因为子矩阵的累加和其实就是按列相加后再按行相加后的值,第0行到2行,压缩三行再求累加和

3429732c32ebf6c8b7c64e919a76b13e.png

function process(arr) {
  let max = -Infinity,
    cur = 0, // 当前累加和
    tempArr = []; // 压缩数组
  // i,j为行的区域
  for (let i = 0; i < arr.length; i++) {
    tempArr = []; // 每次更新区域清空压缩数组
    for (let j = i; j < arr.length; j++) {
      cur = 0; // 每行重新计算累加和,因为会压缩数组
      for (let k = 0; k < arr[0].length; k++) {
        tempArr += arr[j][k];
        cur += tempArr;
        max = Math.max(max, cur);
        cur = cur < 0 ? 0 : cur;
      }
    }
  }
}