POJ1050题解
模型一:求无长度限制的最大子段和
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int a[N][N], maxrow[N], row[N];
int main()
{
int n;
cin >> n;
//读入矩阵数据
for(int i = 0; i < n; i ++ )
for(int j = 0; j < n; j ++ ) cin >> a[i][j];
int ans = 0;
//在求最大子矩阵之和之前,我们不妨先将问题转化成一个更弱的问题:求最大子序列之和
//我们假设maxrow[i]是以第i个元素结尾的和最大的连续序列
//假设row[5] = {1, 2, 3, -7, 5}
//那么:
//maxrow[0] = 1
//maxrow[1] = 3
//maxrow[2] = 6
//maxrow[3] = -1
//maxrow[4] = 5
//易得maxrow[i] = maxrow[i - 1] > 0 ? maxrow[i - 1] + row[i] : row[i]
//再回到原来的问题我们发现,N * N个矩阵可以看成多个矩阵的各个元素相加变成一个数组
//接下来枚举不同数量数组合成一个数组的不同的maxrow,再找出最大值即可
for(int i = 0; i < n; i ++ )
{
memset(row, 0, n * 4);//重置row
for(int j = i; j < n; j ++ )
{
for(int c = 0; c < n; c ++ )
row[c] += a[j][c];
maxrow[0] = row[0];
for(int c = 0; c < n; c ++ )
{
maxrow[c] = maxrow[c - 1] > 0 ? maxrow[c - 1] + row[c] : row[c];
ans = max(ans, maxrow[c]);
}
}
}
cout << ans << '\n';
}