题意:一个矩阵的大小为\(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\n", res);

	return 0;
}