https://vjudge.net/contest/279730#problem/E
思路:题目看似是求最大子矩阵,思路和最大公共子序列一样,a[i][j]代表了前i行的前j列的所有元素的和,然后直接套路,值得注意的是个人习惯,DP题目数组下标从1开始
可以避免一些麻烦.
#include <cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[105][105],i,j,k,n,t,sum,imax;
int main()
{
while (~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
{
scanf("%d",&t);
a[i][j]=a[i-1][j]+t;
}
imax=0;
for (i=1;i<=n;++i)
for (j=i;j<=n;++j)
{
sum=0;
for (k=1;k<=n;++k)
{
t=a[j][k]-a[i-1][k];
sum+=t;
if (sum<0) sum=0;
if (sum>imax) imax=sum;
}
}
printf("%d\n",imax);
}
return 0;
}