今天写到这个题 突然想起之前写的那个题 是这个题的缩小版
题目就不黏贴了
这个是hdu1003 也就是本体缩小版链接http://blog.youkuaiyun.com/xishizuozuo/article/details/53869418
题解 这个题一开始我并没有觉得熟悉 后来才发现这就是hdu1003的升级版
那个题是枚举长度 这个题是在长度上面加了一个高 就变成了枚举长宽
先上代码 再解释
#include<stdio.h>
#include<string.h>
#define mini -99999999
int s1[300][300];
int dp[300];
int main()
{
int max,sum;
int n,a,b,i,j,m;
while(scanf("%d",&n)!=EOF)
{
max=mini;
memset(dp,0,sizeof(dp));
for(a=1;a<=n;a++)
for(b=1;b<=n;b++)
scanf("%d",&s1[a][b]);
for(a=1;a<=n;a++) //这里是枚举高 限定从哪一行开始
{
memset(dp,0,sizeof(dp));//每一次枚举都是单独的 所以每一次都要归零
for(b=a;b<=n;b++)//这里就是在枚举底边
{
sum=0;
for(i=1;i<=n;i++)
{
dp[i]+=s1[b][i];//dp[i]存在i列所有数字 等于就是在枚举右边 ,为什么不枚举左边请看我上面发的链接
if(sum<=0)sum=dp[i];
else sum+=dp[i];
if(sum>max)max=sum;
}
}
}
printf("%d\n",max);
}
return 0;
}