classSolution { public: intmaxSumSubmatrix(vector<vector<int>>& matrix, int k){ int m = matrix.size(); int n = matrix[0].size(); if (m > n) { vector<vector<int>> mat(n, vector<int> (m)); for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) mat[j][i] = matrix[i][j]; returnmaxSumSubmatrix(mat, k); }
vector<vector<int>> sum(m, vector<int>(n)); sum[0][0] = matrix[0][0]; for (int i = 1; i < m; ++i) sum[i][0] = sum[i-1][0] + matrix[i][0]; for (int j = 1; j < n; ++j) sum[0][j] = sum[0][j-1] + matrix[0][j]; for (int i = 1; i < m; ++i) for (int j = 1; j < n; ++j) sum[i][j] = matrix[i][j] + sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1];
auto get = [&sum](int a, int b, int c, int d) { return sum[c][d] - (a > 0 ? sum[a-1][d] : 0) - (b > 0 ? sum[c][b-1] : 0) + (a > 0 && b > 0 ? sum[a-1][b-1] : 0); };
int ret = -0x7fffffff; for (int bot = 0; bot < m; ++bot) for (int top = bot; top < m; ++top) { auto S = [&get, bot, top](int i) { returnget(bot, 0, top, i); }; set<int> s; s.insert(0); for (int i = 0; i < n; ++i) { auto p = s.lower_bound(S(i) - k); if (p != s.end()) { ret = max(ret, S(i) - *p); } s.insert(S(i)); } }