题意:
一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。
例如:3*3的矩阵:
-1 3 -1
2 -1 3
-3 1 2
和最大的子矩阵是:
3 -1
-1 3
1 2
分析:
三重循环,类似于求解一维中的最大连续和一样的dp问题,只不过换成了二维而已。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
const int maxn = 505;
int n, m;
long long p[maxn][maxn];
//p[i][j] = a[i][1]+a[i][2]+.....+a[i][j]
int main()
{
while(scanf("%d %d", &m, &n)==2)
{
memset(p, 0, sizeof(p));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
int t;
scanf("%d", &t);
p[i][j] = p[i-1][j] + t;
}
}
// for(int i = 1 ; i <= n ; i++)
// {
// for(int j = 1 ; j <= m ; j++)
// {
// cout<<p[i][j]<<" ";
// }
// cout<<endl;
// }
int maxn = 0;
for(int i = 1; i <= n; i++)
{
for(int j = i; j <= n; j++)
{
int sum = 0;
for(int k = 1; k <= m; k++)
{
sum += (p[j][k] - p[i-1][k]);
if(sum < 0)
sum = 0;
if(sum > maxn)
maxn = sum;
}
}
}
printf("%d\n", maxn);
}
return 0;
}