你上有一门威力巨大的光束炮,然而它现在剩下的能量只能再发射一次。为了使敌人受到更大的损失,你必须谨慎地使用这仅剩的一次机会。
敌军队形和光束炮的覆盖范围均为矩形(矩形不可旋转)。
输入要求
输入数据有多组,每组第一行是两个整数n和m(1 <= n, m <= 30),表示敌军队形的宽和高;接下来的m行,每行有n个整数ai(1<=ai<=100),每个整数表示敌军每个机动战士的价值;接着一行是两个整数w和h(1 <= w, h <= 30),表示你的光束炮的覆盖覆盖范围的宽和高。输入以EOF结束。
输出要求
对于多组输入数据,每组输出一行,每行一个整数,表示敌军可能受到的最大损失。
测试数据
输入示例
3 3
1 2 3
4 5 6
7 8 9
2 2
2 3
1 1
1 1
1 1
10 10
输出示例
28
6
小贴士
声明:本套题目由ACM协会内一腐宅命题,其中可能出现奇怪的模型与题目设定,相关设定不代表协会观点与立场。
题目来源
2014年BNUZ-ACM新生赛现场赛原题命题:北京师范大学珠海分校ACM协会陈思佳
1. #include<stdio.h>
2. int main() {
3. int a[100][100];
4. int m, n, w, h, i, j, k, g;
5. long long max, sum;
6. while(~scanf("%d%d", &n, &m)) {
7. memset(a,0,sizeof(a));
8. max = -1e9;
9. for(i = 0; i < m; i++) {
10. for(j = 0; j < n; j++) {
11. scanf("%d", &a[i][j]);
12. }
13. }
14. scanf("%d%d", &w, &h);//输入数据
15. sum = 0;
16. if(w >= n && h >= m) {//如果你的炮特牛萌,能覆盖所有敌人、
17. for(i = 0; i < m; i++) {
18. for(j = 0; j < n; j++) {
19. sum += a[i][j];
20. }
21. }
22. printf("%d\n", sum);
23. continue;
24. }
25. //否则,暴力解吧,这是我渣渣的解法,居然也能过。
26. sum = 0;
27. for(k = 0; k < m ; k++) {
28. for(g = 0; g < n ; g++) {
29. for(i = k; i < h + k; i++) {
30. for(j = g; j < w + g; j++) {
31. sum += a[i][j];
32. }
33. }
34. if(sum > max) {
35. max = sum;
36. }
37. sum = 0;
38. }
39. }
40. printf("%d\n", max);
41. }
42. }
希望有更棒的解法,求轻喷。。