CF1676D X-Sum 题解
题意
有一个 $n×m$ 的国际象棋盘 $a$,$(i,j)$ 上有一个非负整数 $a_{ij}$。
你要在上面放一个象,问它能攻击到的点上的非负整数和最大是多少。
(象走斜线,无距离限制)
思路
直接模拟复杂度达到 $O(n^3)$,不太行。
考虑预处理出每条斜线上的点上的非负整数和。
观察得到,左下-右上斜线上的点 $i+j$ 相等,左上-右下斜线上的点 $i-j$ 相等。
(实际上可以把左下-右上斜线看作 $y=-x+b$, 把左上-右下斜线看作 $y=x+b$)
于是计算每个点对它所在斜线的贡献即可。
代码
#include <cstdio>
#include <cstring>
int T, n, m, s, a[250][250], l[550], r[550];
int main()
{
scanf("%d", &T);
while(T--)
{
memset(l, 0, sizeof l);
memset(r, 0, sizeof r);
scanf("%d%d", &n, &m);s = 0;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
scanf("%d", &a[i][j]), l[i + j] += a[i][j], r[i - j + m] += a[i][j];
for(int i = 1, t;i <= n;++i)
for(int j = 1;j <= m;++j)
if((t = l[i + j] + r[i - j + m] - a[i][j]) > s) s = t;
printf("%d\n", s);
}
return 0;
}