Leecode——2021.04.22
动态规划
363. 矩形区域不超过 K 的最大数值和--------hard
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
int m = matrix.length;
int n = matrix[0].length;
int max = Integer.MIN_VALUE;
for(int i1 = 1; i1 <= m; i1++){
for(int j1 = 1; j1 <= n; j1++){
int[][] dp = new int[m + 1][n + 1];// 表示的是dp[i][j]表示的是从i,j这个点到右下角的不超过k的最大值
dp[i1][j1] = matrix[i1 - 1][j1 - 1];// 这里是初始化,也可以看做就是从(i1,j1)---->(i1,j1)
for(int i2 = i1; i2 <= m; i2++){
for(int j2 = j1; j2 <= n; j2++){
// 这里就是从(i1,j1)--->(i2,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 && max < dp[i2][j2]){
max = dp[i2][j2];
}
}
}
}
}
return max;
}
}
// 我的做法:暴力破解:超时
class Solution {
public int maxSumSubmatrix(int[][] matrix, int k) {
int m = matrix.length;
int n = matrix[0].length;
int max = Integer.MIN_VALUE;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
// 从行列的长度来进行遍历
int res = getRes(matrix, i, j, k);
max = Math.max(res, max);
if(max == k){
return max;
}
}
}
return max;
}
public int getRes(int[][] matrix, int row, int col, int k){
int m = matrix.length;
int n = matrix[0].length;
int max = Integer.MIN_VALUE;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
int top = i;
int down = i + row - 1;
int left = j;
int right = j + col - 1;
if(down < m && right < n){
// 计算这一块区域的大小
int res = calculate(matrix, top, down, left, right);
if(res <= k){
max = Math.max(res, max);
}
}
if(max == k){
return max;
}
}
}
return max;
}
public int calculate(int[][] matrix, int top, int down, int left, int right){
int res = 0;
for(int i = top; i <= down; i++){
for(int j = left; j <= right; j++){
res += matrix[i][j];
}
}
return res;
}
}