Skip to content

Commit 2a56e5d

Browse files
authored
Create lc363. Max Sum of Rectangle No Larger Than K-dp-hard.md
1 parent 171c914 commit 2a56e5d

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
```cpp
2+
class Solution {
3+
public:
4+
int maxSum(vector<vector<int>>& matrix, int k){
5+
int n = matrix.size();
6+
if(n ==0)
7+
return 0;
8+
int m = matrix[0].size();
9+
set<int> lower;
10+
11+
vector<int> sum(n+1,0);
12+
vector<int> col_sum(n,0);
13+
int ans = INT32_MIN /2;
14+
for(int l = 0 ; l<m ; ++l){
15+
// fill_n(sum.begin(), 0, m+1);
16+
// fill_n(col_sum.begin(), 0, m);
17+
fill(sum.begin(), sum.end(),0);
18+
fill(col_sum.begin(),col_sum.end(),0);
19+
// vector<int> sum(m+1,0);
20+
// vector<int> col_sum(m,0);
21+
// cout << "======== l = "<< l << "=========\n";
22+
for(int r = l ;r <m ; ++r){
23+
lower.clear();
24+
lower.insert(0);
25+
// cout << "======== r = "<< r <<"============\n";
26+
for(int i=0 ; i<n ; ++i){
27+
col_sum[i] += matrix[i][r];
28+
sum[i+1] =sum[i] + col_sum[i];
29+
// cout << col_sum[i] << " " <<sum[i+1]<<"\n" ;
30+
int find = sum[i+1] - k;
31+
auto it = lower.lower_bound(find);
32+
if (it != lower.end()){
33+
// cout << *it << " " << r<< " " << i << "\n";
34+
ans = max(ans, sum[i+1] - *it);
35+
}
36+
lower.insert(sum[i+1]);
37+
}
38+
// cout << "\n";
39+
}
40+
// cout << "\n";
41+
}
42+
return ans;
43+
}
44+
int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
45+
int n = matrix.size();
46+
if(n ==0)
47+
return 0;
48+
int m = matrix[0].size();
49+
if(n > m ){
50+
return maxSum(matrix,k);
51+
}
52+
set<int> lower;
53+
54+
vector<int> sum(m+1,0);
55+
vector<int> col_sum(m,0);
56+
int ans = INT32_MIN /2;
57+
for(int l = 0 ; l<n ; ++l){
58+
// fill_n(sum.begin(), 0, m+1);
59+
// fill_n(col_sum.begin(), 0, m);
60+
fill(sum.begin(), sum.end(),0);
61+
fill(col_sum.begin(),col_sum.end(),0);
62+
// vector<int> sum(m+1,0);
63+
// vector<int> col_sum(m,0);
64+
// cout << "======== l = "<< l << "=========\n";
65+
for(int r = l ;r <n ; ++r){
66+
lower.clear();
67+
lower.insert(0);
68+
// cout << "======== r = "<< r <<"============\n";
69+
for(int i=0 ; i<m ; ++i){
70+
col_sum[i] += matrix[r][i];
71+
sum[i+1] =sum[i] + col_sum[i];
72+
// cout << col_sum[i] << " " <<sum[i+1]<<"\n" ;
73+
int find = sum[i+1] - k;
74+
auto it = lower.lower_bound(find);
75+
if (it != lower.end()){
76+
// cout << *it << " " << r<< " " << i << "\n";
77+
ans = max(ans, sum[i+1] - *it);
78+
}
79+
lower.insert(sum[i+1]);
80+
}
81+
}
82+
}
83+
return ans;
84+
}
85+
};
86+
87+
```

0 commit comments

Comments
 (0)