最大的子六边形!!!降成最大矩阵和,在降成最大字段和,其算法和最大子矩阵和一样!!!
#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;}