一道很不错的题目。
思路详解:
显然的,注意到两个象如果想满足题目所给的条件只能是一个在白一个在黑。
用预处理的方式将两种不同的斜线所能带来的贡献提前算出,最后枚举所有点,取一下
max
\max
max 即可。
主要是这种题的思路是在说不清楚,大家可以看我的代码自行理解一下。
#include <bits/stdc++.h>
using namespace std;
const int N = 4010;
using ll = long long;
ll a[N][N], c[N], b[N];
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
b[i - j + n] += a[i][j];
c[i + j] += a[i][j];
}
}
ll sum1 = -1, sum2 = -1;
int X1, X2, Y1, Y2;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
ll sum = b[i - j + n] + c[i + j] - a[i][j];
if (sum1 < sum && (i + j) % 2 == 0) {
sum1 = sum;
X1 = i, Y1 = j;
} else if (sum2 < sum && (i + j) & 1) {
sum2 = sum;
X2 = i, Y2 = j;
}
}
}
cout << sum1 + sum2 << "\n";
cout << X1 << " " << Y1 << " " << X2 << " " << Y2 << "\n";
return 0;
}