/*
* @lc app=leetcode id=363 lang=cpp
*
* [363] Max Sum of Rectangle No Larger Than K
*
* https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/
*
* algorithms
* Hard (35.57%)
* Likes: 487
* Dislikes: 36
* Total Accepted: 30.4K
* Total Submissions: 85.3K
* Testcase Example: '[[1,0,1],[0,-2,3]]\n2'
*
* Given a non-empty 2D matrix matrix and an integer k, find the max sum of a
* rectangle in the matrix such that its sum is no larger than k.
*
* Example:
*
*
* Input: matrix = [[1,0,1],[0,-2,3]], k = 2
* Output: 2
* Explanation: Because the sum of rectangle [[0, 1], [-2, 3]] is
* 2,
* and 2 is the max number no larger than k (k = 2).
*
* Note:
*
*
* The rectangle inside the matrix must have an area > 0.
* What if the number of rows is much larger than the number of columns?
*
*/
// @lc code=start
class Solution {
public:
int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
const int M = matrix.size(), N = M == 0 ? 0 : matrix[0].size();
vector<vector<int>> sum(M, vector<int>(N, 0));
int res = INT_MIN;
for (int i = 0; i < N; ++i) {
vector<int> sum(M);
for (int j = i; j < N; ++j) {
for (int k = 0; k < M; ++k) {
sum[k] += matrix[k][j];
}
int cur_sum = 0;
set<int> s({0});
for (auto a : sum) {
cur_sum += a;
const auto it = s.lower_bound(cur_sum - k);
if (it != s.end()) res = max(res, cur_sum - *it);
s.insert(cur_sum);
}
}
}
return res;
}
};
// @lc code=end