题目链接:leetcode.
/*
四重循环,好家伙(27 / 27 个通过测试用例),当然超时
*/
class Solution {
public:
int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
int M = matrix.size(), N = matrix[0].size();
vector<vector<int>> dp(M+1, vector<int>(N + 1, 0));
//先建立dp数组保存左上角的值
for(int i = 1;i <= M;++i)
{
for(int j = 1;j <= N;++j)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + matrix[i - 1][j - 1];
if(dp[i][j] == k)
return k;
}
}
//再计算每个矩形的值
int ans = INT_MIN;
for(int i = 1;i <= M;++i)
{
for(int j = 1;j <= N;++j)
{
for(int p = i;p <= M;++p)
{
for(int q = j;q <= N;++q)
{
int t = dp[p][q] - dp[p][j - 1] - dp[i - 1][q] + dp[i - 1][j - 1];
if(t < k)
{
ans = max(ans, t);
}
else if(t == k)
return k;
}
}
}
}
return ans;
}
};
有点搞笑,,把四重循环时计算的小矩形从[i, j]到[p, q]改成[p, q]到[i, j]就过了???
/*
执行用时:1968 ms, 在所有 C++ 提交中击败了5.11%的用户
内存消耗:8.4 MB, 在所有 C++ 提交中击败了74.86%的用户
*/
class Solution {
public:
int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
int M = matrix.size(), N = matrix[0].size();
vector<vector<int>> dp(M+1, vector<int>(N + 1, 0));
//先建立dp数组保存左上角的值
for(int i = 1;i <= M;++i)
{
for(int j = 1;j <= N;++j)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + matrix[i - 1][j - 1];
// if(dp[i][j] == k)
// return k;
}
}
//再计算每个矩形的值
int ans = INT_MIN;
for(int i = 1;i <= M;++i)
{
for(int j = 1;j <= N;++j)
{
for(int p = 1;p <= i;++p)
{
for(int q = 1;q <= j;++q)
{
int t = dp[i][j] - dp[i][q - 1] - dp[p - 1][j] + dp[p - 1][q - 1];
if(t <= k)
{
ans = max(ans, t);
}
// else if(t == k)
// return k;
}
}
}
}
return ans;
}
};
大神们还写了一个固定左右边界(因为题中说行数远小于列数)的题解,但我懒得写惹,下次再看
711

被折叠的 条评论
为什么被折叠?



