关闭

HDU-1559最大子矩阵

标签: dp数学
446人阅读 评论(0) 收藏 举报
分类:

方法:先将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 ;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:133520次
    • 积分:3516
    • 等级:
    • 排名:第9765名
    • 原创:228篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    最新评论