思路:定義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;
}