题目链接:Click here
题意:给定一个矩阵,求最大子矩阵的和。
思路:与最大连续子序列相比,这道题将一维数组扩展到了二维。可以将矩阵压缩,将二维压缩成一维。具体结合代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;
int a[105][105];
int dp[105];
int main()
{
int n, ans, sum;
while(scanf("%d", &n) != EOF)
{
memset(a, 0, sizeof(a));
memset(dp, 0, sizeof(dp));
if(n == 0)break;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
scanf("%d", &a[i][j]);
a[i][j] += a[i][j-1]; //将每一行前i个数的和求出
}
ans = -100000000;
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
{
sum = 0;
for(int k = 1; k <= n; k++)
{
sum += a[k][j] - a[k][i-1];
if(ans < sum)
ans = sum;
if(sum < 0)
sum = 0;
}
}
printf("%d\n", ans);
}
return 0;
}