思路:定义temp这个数组对表中可能出现的组合进行一一表示,例如temp[1][1][1]=a[1][1],而temp[1][1][n]=a[1][1]+a[1][2]+到a[1][n],temp[1][n][n]=a[n][1]+a[n][2]+到a[n][n],容易看出temp数组随着k,i,j的不同,可以取各种组合。从而找到最大值。
#include<stdio.h>
#include<string.h>
int n,a[105][105],tmp[105][105][105]; //a[][]为输入,tmp[k][i][j]中保存第k列,从i行到j行的综合。
void Set() //初始化tmp
{
memset(tmp,0,sizeof(tmp));
int i,j,k;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d",&a[i][j]);
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=i; j<=n; j++)
for(int p=i; p<=j; p++)
tmp[k][i][j]+=a[p][k];
}
int main()
{
while(~scanf("%d",&n))
{
Set();
int sum,_max=0,i,j,k;//此题不存在每个数都为负的情况。
for(i=1; i<=n; i++)
for(j=i; j<=n; j++)
{
sum=0; //每计算一组从i行到j行的矩形都要给sum先清零。
for(k=1; k<=n; k++) //同一维数组的寻找连续字串的和。
{
sum+=tmp[k][i][j];
if(sum<0) sum=0;
if(sum>_max) _max=sum;
}
}
printf("%d\n",_max);
}
return 0;
}