<hdoj1559>最大子矩阵
2016-08-09 12:14
363 查看
Description
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。
Output
对于每组数据,输出一个整数,表示子矩阵的最大和。
Sample Input
Sample Output
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。
Output
对于每组数据,输出一个整数,表示子矩阵的最大和。
Sample Input
1 4 5 2 2 3 361 649 676 588 992 762 156 993 169 662 34 638 89 543 525 165 254 809 280
Sample Output
2474
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; #define INF 1<<30; int dp[1001][1001]; int main() { int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int n,m,x,y; scanf("%d%d%d%d",&n,&m,&x,&y); int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&dp[i][j]); dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];//把一个i*j矩阵的和存到右下角 如上图1 粉色为 2*2 3*3 4*4的和 if(i>=x&&j>=y) { ans=max(ans,dp[i][j]-dp[i-x][j]-dp[i][j-y]+dp[i-x][j-y]); //取我们需要的矩阵大小 把边框减去 如上图2 我们需要黄色的矩阵 减去蓝色绿色的即可 绿色部分会重复减去 再加上即可 } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- <统计学习方法>5 逻辑斯蒂回归与最大熵模型
- HDOJ-最大子矩阵(二维dp)
- <hdoj1869>六度分离
- <hdoj1874>畅通工程续
- hdoj 1559 最大子矩阵
- HDOJ 1559 最大子矩阵
- <hdoj1878>欧拉回路
- hdoj 1569 方格取数 【最大点权独立集->最大流】
- 最大连续子序列<hdoj1231>
- <hdoj1596>find the safest road
- nyoj 119 士兵杀敌(三) <模板RMQ--静态数组时求最大最小值>
- <正向/反向>最大匹配算法(Java)
- <c语言经典100例>c14 最大公倍数和最小公倍数
- < openCV > 最大稳定极值区域(MSER-Maximally Stable Extremal Regions)
- HDOJ-----1559最大子矩阵
- <hdoj4514>湫湫系列故事——设计风景线
- <笔记><算法导论> 假设求解问题的算法需要f(n)毫秒,对下表中的每个函数f(n)和时间t,确定可以在时间t内求解的问题的最大规模n。
- 最大子矩阵问题<DP>
- <hdoj2084>数塔
- hdoj1559最大子矩阵