zoukankan      html  css  js  c++  java
  • 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
    ",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 }








  • 相关阅读:
    Mono项目将继续推动基于Linux的开发
    VS.PHP 在Visual Studio 下的 PHP 开发 IDE 工具
    SQL Server 2008 的代码提示功能
    想做的时候没有机会了
    我的最爱
    双缓冲
    做个好男人!
    再见了,曾经喜欢过的歌手
    看看他是喜欢你还是爱你的~~~
    独家:未来五年程序员应当具备的十项技能
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/3913628.html
Copyright © 2011-2022 走看看