POJ 1050 To the Max
//此题又是DP,我是看了结题报告才想出来的。。。。。。。。。。。。
//苦想了好长时间,就是一层纸捅不破,原来那就
//是应该加一个二维数组记录每行的前i个值得和
//说白了就是记录一下状态,因为题意是一个二维矩阵
//和得优化,所以一维的状态时不能够满足的,看来DP还是没
//理解透彻
#include<iostream>
using namespace std;
int main()
{
int a[110][110],i,j,k,sum,max=-10000,s[110][110];
int n,temp;
while(scanf("%d",&n)!=EOF)
{
memset(s,0,sizeof(s[0][0]));
for(i=0;i<n;++i)
for(j=1;j<=n;++j)
{
scanf("%d",&a[i][j-1]);
s[i][j]=s[i][j-1]+a[i][j-1];
}
for(i=0;i<n;++i)
for(j=i;j<n;++j)
{
sum=0;
for(k=0;k<n;++k)
{
temp=s[k][j]-s[k][i];
sum+=temp;
if(sum<0) sum=0;
else if(sum>max)
max=sum;
}
}
printf("%d\n",max);
}
return 1;
}
using namespace std;
int main()
{
int a[110][110],i,j,k,sum,max=-10000,s[110][110];
int n,temp;
while(scanf("%d",&n)!=EOF)
{
memset(s,0,sizeof(s[0][0]));
for(i=0;i<n;++i)
for(j=1;j<=n;++j)
{
scanf("%d",&a[i][j-1]);
s[i][j]=s[i][j-1]+a[i][j-1];
}
for(i=0;i<n;++i)
for(j=i;j<n;++j)
{
sum=0;
for(k=0;k<n;++k)
{
temp=s[k][j]-s[k][i];
sum+=temp;
if(sum<0) sum=0;
else if(sum>max)
max=sum;
}
}
printf("%d\n",max);
}
return 1;
}