symons

___________每一天都是幸福的!!

  博客园  ::  :: 新随笔  ::  :: 订阅 订阅  :: 管理
 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 }

 

posted on 2012-10-22 01:23  symons  阅读(156)  评论(0编辑  收藏  举报