HDU-1559最大子矩阵

来源:互联网 发布:长春自考网络学校 编辑:程序博客网 时间:2024/05/20 09:10

方法:先将x个行压缩成一行,然后再求连续y个最大子序和。

数据范围不是1000,真坑。

#include<iostream>#include<cstdio>#include<cstring>typedef __int64 LL;using namespace std ;const int N=2005;int a[N][N];LL b[N];LL Maxsum(int n,int k,LL *s){LL ans=0;for(int i=0;i<n;i++){LL sum=s[i];for(int j=i+1;j-i<k;j++) sum+=s[j];ans=max(ans,sum);}return ans;}int main(){int n,m, x,y,k;    LL ans;int T;scanf("%d",&T);    while(T--){scanf("%d %d %d %d",&n,&m,&x,&y);ans=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%d",&a[i][j]);}}for(int i=0;i<=n-x;i++){memset(b,0,sizeof(b));for(int j=i;j-i<x;j++){for(k=0;k<m;k++){b[k]+=a[j][k];}}ans=max(Maxsum(m,y,b),ans);}printf("%I64d\n",ans);    } return 0 ;}