SOJ 4400:http://acm.scu.edu.cn/soj/problem.action?id=4400.
我们都知道最大子段和的求解,是典型的动态规划入门题。最大子矩阵和,将问题拓展到了二维,求解思路是一样的,具体思路可参考博文:http://www.cnblogs.com/fll/archive/2008/05/17/1201543.html.
//#include<iostream>
#include<cstdio>
//using namespace std;
int s[505][505];
int main()
{
int T;
scanf("%d",&T);
int n,m;
int i,j,k;
int temp[505];
int mmax;
while(T--)
{
mmax=-5005;
scanf("%d%d",&n,&m);
for(j=1;j<=m;j++)
s[0][j]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&s[i][j]);
if(i>1)
s[i][j]=s[i-1][j]+s[i][j];
}
}
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
temp[0]=0;
for(k=1;k<=m;k++)
{
temp[k]=s[j][k]-s[i-1][k];
if(temp[k-1]>0)
temp[k]=temp[k-1]+temp[k];
if(temp[k]>mmax)
mmax=temp[k];
}
}
printf("%d\n",mmax);
}
return 0;
}