题目大意:求矩阵的子矩阵的元素和最大
解题思路:《编程之美》上的,把二维空间的转换为一维的,编程求一维数组子序列和的最大值
确定矩阵行的上下界,一旦确定了行的上下界,这个每列在这个上下界区间的元素和就可以看做是一维数组的单个元素。
枚举上下界,求最大值
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;
const int maxn = 101;
int n, ps[maxn][maxn];
inline int BC(int a, int c, int m);
int main()
{
scanf("%d", &n);
for(int i = 0 ; i <= n; i++)
ps[i][0] = ps[0][i] = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
int val;
scanf("%d", &val);
ps[i][j] = ps[i-1][j] + ps[i][j-1] - ps[i-1][j-1] + val;
}
}
int ans = INT_MIN;
int start, all;
for(int a = 1; a <= n; a++)
{
for(int c = a; c <= n; c++)
{
start = BC(a, c, n);
all = start;
for(int i = n - 1; i >= 1; i--)
{
if(start < 0)
start = 0;
start += BC(a, c, i);
if(start > all)
all = start;
}
ans = max(ans, all);
}
}
printf("%d\n", ans);
return 0;
}
inline int BC(int a, int c, int m)
{
return ps[c][m] - ps[c][m-1] - ps[a-1][m] + ps[a-1][m-1];
}