将二维转化为一维。
第一个FOR循环用于枚举 行,第二个和第三个FOR 用于求从当前行(J)开始的每一个矩阵方块和,从而得到ANS。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 const int maxn = 105; 5 int a[ maxn ][ maxn ],temp[ maxn ]; 6 int n; 7 8 int dp( ){ 9 int ans=temp[ 0 ]; 10 int tmp_sum=0; 11 for( int i=0;i<n;i++ ){ 12 tmp_sum+=temp[ i ]; 13 if( ans<tmp_sum ) ans=tmp_sum; 14 if( tmp_sum<0 ) tmp_sum=0; 15 } 16 return ans; 17 } 18 19 int main(){ 20 while( scanf("%d",&n)!=EOF ){ 21 for( int i=0;i<n;i++) 22 for( int j=0;j<n;j++ ) 23 scanf("%d",&a[ i ][ j ]); 24 int ans=-9999999; 25 for( int i=0;i<n;i++ ){ 26 memset( temp,0,sizeof(temp) ); 27 for( int j=i;j<n;j++ ){ 28 for( int k=0;k<n;k++ ){ 29 temp[ k ]+=a[ j ][ k ]; 30 } 31 ans=max( ans,dp() ); 32 } 33 } 34 printf("%d\n",ans); 35 } 36 return 0; 37 }