题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1559
这道题 挺好的,当时想出解法的时候已经比较迟了。还是平时看得少。
把行与列都进行压缩。ans[i][j]存储的是前面所有元素的和。比较的时候注意条件的限制。我个人认为题目中并没有讲清楚谁大谁小,所有都有可能。
但是这道题数据太水了!!!不管是第一个条件还是第二个条件单独放都可以A掉。
源代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<math.h>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
#define MIN -0x3f3f3f3f
#define N 1005
int ans[N][N];
int main()
{
int T;
int i, j;
int m, n, x, y;
int num;
int sum;
scanf("%d", &T);
while (T--)
{
memset(ans, , sizeof(ans));
scanf("%d%d%d%d", &m, &n, &x, &y);
for (i = ; i <= m; i++)
{
for (j = ; j <= n; j++)
{
scanf("%d", &num);
ans[i][j] = ans[i - ][j] + ans[i][j - ] - ans[i - ][j - ] + num;
}
}
sum = ;
for (i = ; i <= m; i++)
{
for (j = ; j <= n; j++)
{
if (i >= x&&j >= y)
sum = max(sum, ans[i][j] + ans[i - x][j - y] - ans[i - x][j] - ans[i][j - y]);
if (i >= y&&j >= x)
sum = max(sum, ans[i][j] + ans[i - y][j - x] - ans[i - y][j] - ans[i][j - x]);//只要满足两者不超出范围就可以,很容易忽略下面的这一种情况
}
}
printf("%d\n", sum);
}
return ;
}