HDU 1559最大矩阵和
2013-08-10 17:29
232 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1559
这题相对上一题来说多了个限制条件,矩阵大小要是x*y的,这样的话倒更简单,只需计算出连续的x行,连续的y列和最大和即可,纵列和的求解用到了压缩的思想,就是把连续的x行上的同一列的数都相加存储在一个数组列对应的的下标元素里面
View Code
这题相对上一题来说多了个限制条件,矩阵大小要是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
相关文章推荐
- 最大子矩阵 hdu 1559
- HDU-1559-最大子矩阵【DP】
- HDU 1559 最大子矩阵--dp--(最大和子矩阵模型)
- HDU 1559 最大子矩阵【最大子矩阵】
- hdu 1559最大子矩阵
- hdu 1559 最大子矩阵 枚举
- hdu 1559 最大子矩阵
- HDU 1559 最大子矩阵 解题报告
- HDU-1559最大子矩阵
- HDU 2870 Largest Submatrix(最大子矩阵面积)
- HDU 2830 Matrix Swapping II(最大完全子矩阵之可移动列)
- 【最大子矩阵】hdu 2870
- HUD-1559 最大子矩阵,dp模拟
- 100道动态规划——21 HDU 1559 最大子矩阵和 树状数组 最大连续子区间和
- HDU 1559 最大子矩阵
- HDU:1559 最大子矩阵(动态规划DP)
- 【二维树状数组】hdu 1559 最大子矩阵
- hdu 1081 To The Max(子矩阵最大和)
- HDU 4888 神奇最大流行进列出构造矩阵
- HDU 4328 Cut the cake 最大相同子矩阵, 悬线法