ACM HDU 1559 最大子矩阵
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1559
这道题 挺好的,当时想出解法的时候已经比较迟了。还是平时看得少。
把行与列都进行压缩。ans[i][j]存储的是前面所有元素的和。比较的时候注意条件的限制。我个人认为题目中并没有讲清楚谁大谁小,所有都有可能。
但是这道题数据太水了!!!不管是第一个条件还是第二个条件单独放都可以A掉。
源代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string> 5 #include<string.h> 6 #include<math.h> 7 #include<map> 8 #include<vector> 9 #include<algorithm> 10 using namespace std; 11 #define MAX 0x3f3f3f3f 12 #define MIN -0x3f3f3f3f 13 #define N 1005 14 int ans[N][N]; 15 int main() 16 { 17 int T; 18 int i, j; 19 int m, n, x, y; 20 int num; 21 int sum; 22 scanf("%d", &T); 23 while (T--) 24 { 25 memset(ans, 0, sizeof(ans)); 26 scanf("%d%d%d%d", &m, &n, &x, &y); 27 for (i = 1; i <= m; i++) 28 { 29 for (j = 1; j <= n; j++) 30 { 31 scanf("%d", &num); 32 ans[i][j] = ans[i - 1][j] + ans[i][j - 1] - ans[i - 1][j - 1] + num; 33 } 34 } 35 sum = 0; 36 for (i = 1; i <= m; i++) 37 { 38 for (j = 1; j <= n; j++) 39 { 40 if (i >= x&&j >= y) 41 sum = max(sum, ans[i][j] + ans[i - x][j - y] - ans[i - x][j] - ans[i][j - y]); 42 if (i >= y&&j >= x) 43 sum = max(sum, ans[i][j] + ans[i - y][j - x] - ans[i - y][j] - ans[i][j - x]);//只要满足两者不超出范围就可以,很容易忽略下面的这一种情况 44 } 45 } 46 printf("%d\n", sum); 47 } 48 return 0; 49 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步