1 /* 2 这题暴力的话时间复杂度太高。 3 本题是一维最大连续子序列的拓展。 4 求二维的话只要转化为一维就可以了。 5 转化方式。将一列的数字通过n^2的时间复杂度归并成一个数, 6 每次归并一次就遍历一下list求最大值(这步就是执行一维的最大连续子序列)。 7 */ 8 #include <iostream> 9 #include <string.h> 10 #include <cmath> 11 using namespace std; 12 int list[150]; 13 int gird[150][150]; 14 void get(int a,int b,int n) //获得list列表。 15 { 16 int i,j; 17 memset(list,0,sizeof(list)); 18 for(j=1;j<=n;++j) 19 { 20 for(i=a;i<=b;++i) 21 { 22 list[j]+=gird[i][j]; 23 } 24 } 25 return; 26 } 27 int find(int n) 28 { 29 int i,j,k; 30 int res=0; 31 for(i=0;i<n;++i) 32 { 33 for(j=0;j<=i;++j) 34 { 35 get(j,i,n); 36 //已经获得list列表,现在进行一维的最大连续子序列。 37 for(k=1;k<=n;++k) 38 { 39 list[k]=max(list[k-1],0)+list[k]; 40 if(list[k]>res) res=list[k]; 41 } 42 43 } 44 } 45 return res; 46 } 47 int main() 48 { 49 int n,i,j; 50 while(cin>>n) 51 { 52 for(i=0;i<n;++i) 53 for(j=1;j<=n;++j) 54 { 55 cin>>gird[i][j]; 56 } 57 cout<<find(n)<<endl; 58 } 59 return 0; 60 }