您的位置:首页 > 其它

HDU 1559最大矩阵和

2013-08-10 17:29 232 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1559

这题相对上一题来说多了个限制条件,矩阵大小要是x*y的,这样的话倒更简单,只需计算出连续的x行,连续的y列和最大和即可,纵列和的求解用到了压缩的思想,就是把连续的x行上的同一列的数都相加存储在一个数组列对应的的下标元素里面

#include<stdio.h>
#include<string.h>
int a[1001][1001],n,m,x,y;
int maxx(int *b,int k)
{
int i,max=0,sum[11111];
for(i=0;i<k;i++)
{
if(i<y)
{
max+=b[i];
sum[y-1]=max;
continue;
}
sum[i]=sum[i-1]-b[i-y]+b[i];
if(sum[i]>max)max=sum[i];
}
return max;//计算不同的行之间的相同的列之和的最大和,即一个矩阵
}
int maxpp()
{
int b[11111],i,j,sum=-999999,max,k;
for(i=0;i<n-x;i++)//将所有的行枚举一遍
{
memset(b,0,sizeof(b));
for(j=i;j<i+x;j++)//这里仿造最大字段和的写法
{
for(k=0;k<m;k++)
{
b[k]+=a[j][k];//b[k]为纵向的列的和,这样每个b[k]对应的行,列就都一样了,就可以进行相加比较了
}
}
max=maxx(b,k);
if(sum<max)sum=max;//这三行之所以放在同一的循环里面就是为了 每一纵列都能进行一次取最大值
}
return sum;
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&n,&m,&x,&y);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
printf("%d\n",maxpp());
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: