题目大意:给出一个二维矩阵,每个位置都有一个整数,要求最大子矩阵和。
考察点:DP
思路分析:又是一道经典题。我们可以先处理一个sum[i][j],表示第i列第一个元素到第j个元素的和,那么sum[i][j]-sum[i][k]就是第i列从第k行到第j行的和,处理出k到j的每一个这样的和,再用一次最大连续子序列和,即为第k行到第j行的最大子矩阵和。
#include<stdio.h>
#define max(x,y) (x)>(y)? (x):(y)
int a[101][101];long int sum[101][101];
long int f[101][101]; int n;
int main()
{
int i,j,k,m;
long int ans;
while (scanf("%d",&n)!=EOF)
{
ans=0;m=-100000;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
m=max(m,a[i][j]);
}
for (j=1;j<=n;j++)
for (i=1;i<=n;i++)
sum[j][i]=sum[j][i-1]+a[i][j];
for (i=1;i<=n;i++)
for (j=i;j<=n;j++)
{
f[i][j]=0;
for (k=1;k<=n;k++)
{
f[i][j]=max(sum[k][j]-sum[k][i-1]+f[i][j],0);
ans=max(ans,f[i][j]);
}
}
if (ans==0) printf("%d\n",m);
else printf("%d\n",ans);
}
return 0;
}