LintCode 1278 给定一个非空的二维矩阵 matrix 和一个整数 k,找出 matrix 中的一个矩形,该矩形内的元素之和最大并且不超过 k,返回这个最大和。

TLE

class Solution {
public:
    /**
     * @param matrix: a 2D matrix
     * @param k: an integer
     * @return: the max sum of a rectangle in the matrix such that its sum is no larger than k
     */
    int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {
        // Write your code here
        int max=-INT_MAX;
        for(int i=0;i<matrix.size();i++){
            for(int ii=i;ii<matrix.size();ii++){
                vector<int> save(matrix[0].size());
                for(int j=0;j<matrix[0].size();j++){
                    for(int k=i;k<=ii;k++){
                        save[j]+=matrix[k][j];     
                    }
                }
                for(int j=matrix[0].size()-1;j>=0;j--){
                    int ans=0;
                    for(int jj=j;jj>=0;jj--){
                        ans+=save[jj];
                        if(ans<=k&&ans>=max){
                            max=ans;
                        }
                    }
                }
            }
        }
        return max;
    }
};

积分图法

  class Solution {
public:
    int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        dp[0][0] = matrix[0][0];
        for (int i = 1; i<m; ++i) {
            dp[i][0] = dp[i - 1][0] + matrix[i][0];
        }
        for (int i = 1; i<n; ++i) {
            dp[0][i] = dp[0][i - 1] + matrix[0][i];
        }
        for (int i = 1; i<m; ++i) {
            for (int j = 1; j<n; ++j) {
                dp[i][j] = matrix[i][j]+dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
            }
        }
        int maxArea = INT_MIN;
        for (int a = 0; a<m; ++a) {
            for (int b = a; b<m; ++b) {
                for (int c = 0; c<n; ++c) {
                    for (int d = c; d<n; ++d) {
                        int topArea = a == 0 ? 0 : dp[a - 1][d];
                        int leftArea = c == 0 ? 0 : dp[b][c - 1];
                        int ltArea = (a == 0 || c == 0) ? 0 : dp[a - 1][c - 1];
                        int curSum = dp[b][d] - leftArea - topArea + ltArea;
                        if (curSum == k)
                            return k;
                        if (curSum<k)
                            maxArea = max(maxArea, curSum);
                    }
                }
            }
        }
        return maxArea;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值