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;
    }
}
posted @ 2021-04-23 10:51  codeDJH  阅读(33)  评论(0编辑  收藏  举报