///经典的DP问题,将二维转化为一维,即一个序列的连续之和最大 ///先枚举i,j,i为起始行,j为终止行,将从i到j的行对应元素相加,这样得到一行元素 //求此序列中的最大连续和,如此,便可以得到最大的子矩阵之和。 #include<stdio.h> #include<string.h> long temp[102]; long f[102]; long max; int map[102][102],n; int main() { //freopen("maxsum.in","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d",&n)!=EOF) { int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) scanf("%d",&map[i][j]); } max=-100000000; for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { int t=i; memset(temp,0,sizeof(temp)); while(t<=j) { for(int k=1;k<=n;k++) temp[k]+=map[t][k]; t++; } f[0]=0; for(t=1;t<=n;t++) { if(f[t-1]<0) f[t]=temp[t]; else f[t]=temp[t]+f[t-1]; if(f[t]>max) max=f[t]; } } } printf("%d/n",max); } return 0; }