哈尔滨第二次热身赛1004

来源:互联网 发布:mac连wifi能开热点吗 编辑:程序博客网 时间:2024/04/28 20:43

最大的子六边形!!!降成最大矩阵和,在降成最大字段和,其算法和最大子矩阵和一样!!!

 

#include<iostream>
#include<string.h>
using namespace std;
int a[305][305][305],a1[305][305],a2[305];

int fun(int m,int n){
 int _max=-1;int sum=0;int ans=-1;
 for(int j=0;j<m;j++)
    {
     memset(a2,0,sizeof(a2));
     
     for(int k=j;k<m;k++){
      for(int u=0;u<n;u++) a2[u]+=a1[k][u];
      
      ans=a2[0];sum=0;//此处初始化很关键
      for(int x=0;x<n;x++){
       sum+=a2[x];
       if(sum>ans) ans=sum;
       if(sum<0) sum=0;
       }
       
     if(ans>_max) _max=ans;
     }
     
    }
 return _max;
    }
    
int main(){
 int T;
 cin>>T;
 while(T--){
  int l,m,n;
  cin>>l>>m>>n;
  int _max=0;int ans=0;
  
  for(int k=0;k<l;k++)
  for(int i=0;i<m;i++)
  for(int j=0;j<n;j++)
   cin>>a[k][i][j];
   
  for(int i=0;i<l;i++){
   memset(a1,0,sizeof(a1));
   for(int h=i;h<l;h++){
    
    for(int k=0;k<m;k++)
     for(int j=0;j<n;j++)
      a1[k][j]+=a[h][k][j];//将其不同层但m和n相同的加起来!!!
      
    int _max=fun(m,n);
    if(_max>ans) ans=_max;
    }
   }
   
  if(ans>0) 
  cout<<ans<<endl; 
  else cout<<"0"<<endl;
  
   }
return 0;}