首先要学会最大子段和的求法,如下 int DP(int a[],int n) { int i,f[101];//f[i]表示以i结尾子段最大和 int max = -200000000; for(i = 2 , f[1] = a[1] ; i <= n ; i++ ) { if (f[i - 1] > 0) //当前边那个f的值是正的时候 f[i] = f[i - 1] + a[i]; else//负的时候,以a[i]结尾的就不是最大的了 f[i] = a[i]; if (f[i] > max) max = f[i]; } return max; } 然后求最大子矩阵和的时候,思路是取出两行i,j,,把这两行之间同一列的都加起来形成另外一个数组,求这个数组的最大子段和,求出来的这个和,就是这两行之间高度为i-j的子矩阵中最大的 和. #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { int n,i,he,j; int a[105][105],k; int sum[105],max; scanf("%d",&n); for( i = 1 ; i <= n ; i++ ) for( j = 1 ; j <= n ; j++ ) scanf("%d",&a[i][j]); max = -200000000; for( i = 1 ; i <= n ; i++ ) { memset(sum,0,sizeof(sum)); for(j = i ; j <= n ; j++ ) { for( k = 1 ; k <= n ; k++ ) sum[k] += a[j][k]; he = DP(sum,n); if(he>max) max = he; } } printf("%d/n",max); return 0; }