题意:一个矩阵的大小为(N * N)。求这个矩阵中的最大子矩阵和,(N <= 100)。
分析:先考虑一维的状况,即(dp[i] = dp[i - 1] < 0 ? val[i] : dp[i - 1] + val[i]),我们可以把从第i行到第j行的每列数加起来,然后变成一维数组,存储在f[]数组中。然后再对这个数组求dp。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 105;
const int inf = 0x3f3f3f3f;
int val[N][N];
int sum[N][N];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
scanf("%d", &val[i][j]);
}
int res = -inf;
for (int i = 1; i <= n; ++i)
{
for (int j = i; j <= n; ++j)
{
int f[N] = { 0 };
for (int k = 1; k <= n; ++k)
{
sum[i][k] += val[j][k];
f[k] = (f[k - 1] > 0 ? f[k - 1] + sum[i][k] : sum[i][k]);
if (f[k] > res)
{
res = f[k];
}
}
}
}
printf("%d
", res);
return 0;
}