问题描述 :
给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。
示例:
输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2
解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。
说明:
矩阵内的矩形区域面积必须大于 0。
如果行数远大于列数,你将如何解答呢?
输入说明 :
首先输入matrix的行数m、列数n,
然后输入m行,每行n个整数。
最后输入一个整数k。
输出说明 :
输出一个整数。
输入范例 :
2 3
1 0 1
0 -2 3
2
输出范例 :
2
#include<iostream>
#include<vector>
using namespace std;
//暴力求解
int maxSumSubmatrix(vector<vector<int>> &matrix,int k){
if(matrix.empty()||matrix[0].empty())
return 0;
int m=matrix.size(),n=matrix[0].size();
int sum[m][n];
int res = INT_MIN;
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j ++){
int t = matrix[i][j];
if(i > 0)
t += sum[i - 1][j];
if(j > 0)
t += sum[i][j - 1];
if(i > 0 && j > 0)
t -= sum[i - 1][j - 1];
sum[i][j] = t;//以i和j 为边的矩形面积
for(int r = 0; r <= i; r ++){
for(int c = 0; c <= j; c ++){//在每一个大矩形的内部 分别求得每个矩形的面积
int d = sum[i][j];
if(r > 0)
d -= sum[r - 1][j];
if(c > 0)
d -= sum[i][c - 1];
if(r > 0 && c > 0)
d += sum[r - 1][c - 1];
if(d <= k)
res = max(res, d);
}
}
}
}
return res;
}
int main(){
int m,n,num,k;
cin>>m>>n;
vector<int> tmp;
vector<vector<int>> matrix;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>num;
tmp.push_back(num);
}
matrix.push_back(tmp);
tmp.clear();
}
cin>>k;
int res=maxSumSubmatrix(matrix,k);
cout<<res;
}