参考博客:http://blog.csdn.net/acm_davidcn/article/details/5834454
d[i][j]表示到第i行的所有的同一列的和,3个for循环,时间复杂度O(n^3),表示从第i行到第j行 求从第1列到第n列 连续的最大值。
ac代码:
1 #include<stdio.h> 2 #include<string.h> 3 int d[110][110]; 4 int main() 5 { 6 int n,i,j,max,k,sum,t; 7 while(~scanf("%d",&n)) 8 { 9 memset(d,0,sizeof(d)); 10 11 for(i=1; i<=n; i++) 12 for(j=1; j<=n; j++) 13 { 14 scanf("%d",&d[i][j]); 15 d[i][j]+=d[i-1][j]; 16 } 17 max=d[1][1]; 18 19 for(i=1; i<=n; i++) 20 for(j=i; j<=n; j++) 21 { 22 sum=0; 23 for(k=1; k<=n; k++) 24 { 25 t=d[j][k]-d[i-1][k]; 26 sum+=t; 27 28 if(sum>=max) 29 max=sum; 30 31 if(sum<0) 32 sum=0; 33 } 34 } 35 36 printf("%d\n",max); 37 } 38 }
再贴上我之前自己写的O(n^4)的代码(不知道为么,杭电上对了,sdut上没对)
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 const int INF=-1<<29; 5 int main() 6 { 7 int n,i,j,k,l,d[110][110],a[110],max1,max2,dp[110]; 8 while(~scanf("%d",&n)) 9 { 10 max2=INF; 11 for(i=0; i<n; i++) 12 for(j=0; j<n; j++) 13 scanf("%d",&d[i][j]); 14 15 for(i=0; i<n; i++) 16 for(j=i; j<n; j++) 17 { 18 memset(a,0,sizeof(a)); 19 memset(dp,0,sizeof(dp)); 20 for(k=0; k<n; k++) 21 { 22 for(l=i; l<=j; l++) 23 { 24 a[k]+=d[l][k]; 25 } 26 if(k==0) 27 {dp[0]=a[0]; max1=dp[0];} 28 else 29 { 30 if(dp[k-1]>0) dp[k]=a[k]+dp[k-1]; 31 else dp[k]=a[k]; 32 } 33 if(dp[k]>max1) 34 max1=dp[k]; 35 } 36 if(max1>max2) 37 max2=max1; 38 } 39 printf("%d\n",max2); 40 } 41 }