CCA的矩阵
题目链接:nowcoder 213877
到主站看:https://blog.csdn.net/weixin_43346722/article/details/112135072
题目大意
这是一个 3×3 的锤子能锤到的地方。(反正就是哈曼顿距离小于 3 的都会被锤到)
- - * - - - * * * - * * * * * - * * * - - - * - -
现在地图上有一些老鼠,问你用大小是 i×i 的锤子锤一次最多能锤到多少个。
思路
看到这个图形,我们可以想到把它摆正。
那我们就把它摆正之后跑前缀和,就可以枚举每个得出打这个点的答案。
然后求最大值,就可以了。
代码
#include<cstdio> #include<iostream> #define ll long long using namespace std; ll a[2001][2001], q[4001][4001], maxn; int n, k, tx, ty; int main () { scanf("%d %d",&n, &k); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { scanf("%lld", &a[i][j]); q[n + i - j][i + j] = a[i][j]; } for (int i = 1; i <= 2 * n; i++) for (int j = 1; j <= 2 * n; j++) q[i][j] = q[i][j] + q[i - 1][j] + q[i][j - 1] - q[i - 1][j - 1]; k = k * 2 - 1; for (int i = 1; i <= 2 * n; i++) for (int j = 1; j <= 2 * n; j++) if ((i + j - n) % 2 == 0) { tx = i + k - 1; ty = j + k - 1; if (tx <= 2 * n && ty <= 2 * n) maxn = max(maxn, q[tx][ty] - q[tx][j - 1] - q[i - 1][ty] + q[i-1][j-1]); } printf("%lld", maxn); return 0; }