To the Max

Description

Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle. 
As an example, the maximal sub-rectangle of the array: 

0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
is in the lower left corner: 

9 2 
-4 1 
-1 8 
and has a sum of 15. 

Input

The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].

Output

Output the sum of the maximal sub-rectangle.

Sample Input

4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2

Sample Output

15


最大字串和的升级
对于数列A[1->n] dp[i]=dp[i-1]+a[i] dp[i-1]>0 || dp[i]=a[i] dp[i-1]<=0;
现在将矩阵建立与最大字串和相关联的模型。
矩阵压缩。滚动数组。

用s[k]表示第K列,第I行到第J行的和,把和看成一个数列中的一个AI即可。就转化成了最大字串和的问题。

 1 #include"iostream"
 2 #include"cstdio"
 3 #include"cstring"
 4 using namespace std;
 5 const int ms=110;
 6 int n,ans;
 7 int matrix[ms][ms];
 8 int s[ms];
 9 int main()
10 {
11     int i,j,k,t;
12     while(scanf("%d",&n)!=EOF)
13     {
14         for(int i=1;i<=n;i++)
15             for(j=1;j<=n;j++)
16                 scanf("%d",&matrix[i][j]);
17         ans=-0x7fffffff;
18         for(i=1;i<=n;i++)   //从第I行出发的子矩阵
19         {
20             memset(s,0,sizeof(s));
21             for(j=i;j<=n;j++)   //到达第J行的子矩阵
22             {
23                 t=0;
24                 for(k=1;k<=n;k++)//包含第K列 最大矩阵
25                 {
26                     s[k]+=matrix[j][k];
27                     if(t<=0)
28                         t=s[k];
29                     else
30                         t+=s[k];
31                     if(t>ans)
32                         ans=t;
33                         
34                 } 
35             } 
36         } 
37         printf("%d\n",ans);
38     }
39     return 0;
40 }

接下来三维矩阵

同样的压缩思想。把立体——>平面——>直线

 1 #include"iostream"
 2 #include"cstdio"
 3 #include"cstring"
 4 #include"algorithm"
 5 using namespace std;
 6 const int ms=101;
 7 int t,n,m;
 8 int num[ms][ms][ms];
 9 int submax(int a[ms]);
10 int submax2d(int a[][ms]);
11 int submax3d();
12 int main()
13 {
14     int i,j,k;
15     int test;
16     cin>>test;
17     while(test--)
18     {
19         cin>>t>>n>>m;
20         for(k=1;k<=t;k++)
21             for(i=1;i<=n;i++)
22                 for(j=1;j<=m;j++)
23                     cin>>num[k][i][j];
24     //    cout<<submax3d()<<endl;
25         int ans=submax3d();
26         cout<<ans<<endl;
27     }
28     return 0;
29 }
30 int submax(int a[ms])
31 {
32     int i,pre=a[1],max=a[1];
33     for(i=2;i<=m;i++)
34     {
35         if(pre>0)
36             pre+=a[i];
37         else
38             pre=a[i];
39         if(pre>max)
40             max=pre;
41     }
42     return max;
43 }
44 int submax2d(int a[][ms])
45 {
46     int b[ms];
47     int i,j,k,max=a[1][1];
48     for(i=1;i<=n;i++)
49     {
50         memset(b,0,sizeof(b));
51         for(j=i;j<=n;j++)
52         {
53             for(k=1;k<=m;k++)
54             {
55                 b[k]+=a[j][k];
56             }
57             int ff=submax(b);
58             if(ff>max)
59                 max=ff;
60         }
61     }
62     return max;
63 }
64 int submax3d()
65 {
66     int a[ms][ms];
67     int i,j,k,w;
68     int max=num[1][1][1];
69     for(i=1;i<=t;i++)
70     {
71         memset(a,0,sizeof(a));
72         for(j=i;j<=t;j++)
73         {
74             for(k=1;k<=n;k++)
75                 for(w=1;w<=m;w++)
76                     a[k][w]+=num[j][k][w];
77         }
78         int tt=submax2d(a);
79         if(tt>max)
80             max=tt;
81     }
82     return max;
83 }

 









posted @ 2014-08-14 22:43  daydaycode  阅读(148)  评论(0编辑  收藏  举报