363. 矩形区域不超过 K 的最大数值和
思路一:暴力求解
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
int rows = matrix.length;
int cols = matrix[0].length;
int max = Integer.MIN_VALUE;
int[][][][] dp = new int[rows+1][cols+1][rows+1][cols+1];
for(int i1=1;i1<=rows;i1++){
for(int j1=1;j1<=cols;j1++){
for(int i2=i1;i2<=rows;i2++){
for(int j2=j1;j2<=cols;j2++){
dp[i1][j1][i2][j2] = dp[i1][j1][i2-1][j2] + dp[i1][j1][i2][j2-1] - dp[i1][j1][i2-1][j2-1] + matrix[i2-1][j2-1];
System.out.print(i1+"\t"+j1+"\t"+i2+"\t"+j2+"\t"+dp[i1][j1][i2][j2]+"\n");
if(dp[i1][j1][i2][j2]<=k && dp[i1][j1][i2][j2]>max) max = dp[i1][j1][i2][j2];
}
}
}
}
return max;
}
}
思路二:暴力求解+压缩
- 鉴于我们只是用dp来暂存用来计算[i1][j1]到[i2][j2]组成的矩形的值。我们并没有必要存储其中的值。
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
int rows = matrix.length;
int cols = matrix[0].length;
int max = Integer.MIN_VALUE;
for(int i1=1;i1<=rows;i1++){
for(int j1=1;j1<=cols;j1++){
int[][] dp = new int[rows+1][cols+1];
for(int i2=i1;i2<=rows;i2++){
for(int j2=j1;j2<=cols;j2++){
dp[i2][j2] = dp[i2-1][j2] + dp[i2][j2-1] - dp[i2-1][j2-1] + matrix[i2-1][j2-1];
if(dp[i2][j2]<=k && dp[i2][j2]>max) max = dp[i2][j2];
}
}
}
}
return max;
}
}