题目描述
求最大的子矩阵的和
样例
Sample Input
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
Sample Output
15
最大子矩阵为
9 2 -6
-4 1 -4
-1 8 0
思路
- 把一列的元素(1 - n个元素相加), 然后把这这些元素的和看做一个数, 这样就转换成了dp经典问题:求最大连续子序列的和
- 这里枚举每一列个连续的(1 - n个数相加的情况)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10010;
int g[N][N], d[N];
int n, ans = -0x3f3f3f3f;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> g[i][j];
for(int i = 1; i <= n; i++)
{
memset(d, 0, sizeof d);
for(int j = i; j <= n; j++)
{
for(int k = 1; k <= n; k++)
{
d[k] += g[j][k];
}
int sum = 0;
for(int k = 1; k <= n; k++)
{
sum += d[k];
ans = max(ans, sum);
if(sum < 0) sum = 0;
}
}
}
cout << ans << endl;
return 0;
}