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;
}
};