求调试/kk
#include <bits/stdc++.h>
using namespace std;
#define ms(x,v) memset(x, v, sizeof(x))
typedef long long ll;
ll n, a[1005][1005];
ll ld[2010], rd[2010];
ll solve(ll i) {
if (i == 1) return ld[n];
if (i == n) return rd[n];
return ld[n - i + 1] + rd[n - i + n] + ld[n + i - 1] + rd[i] - a[1][i] - a[n - i + 1][n] - a[n][n - i + 1] - a[i][1];
}
int main() {
freopen("pacman.in", "r", stdin);
freopen("pacman.out", "w", stdout);
scanf("%lld", &n);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
scanf("%lld", &(a[i][j]));
// 右上角第一个开始点为1...直到左上角为n...直到左下角为2n-1 此为ld
// 左上角第一个开始点为1...直到右上角为n...直到右下角为2n-1 此为rd
for (int i = 1; i < n * 2; ++i) {
int r = 1, c = n - i + 1; // row column
if (i > n) { c = 1; r = i - n + 1; }
for (; r <= n && c <= n; ++r, ++c)
ld[i] += a[r][c];
}
for (int i = 1; i < n * 2; ++i) {
int r = 1, c = i;
if (i > n) { c = n; r = i - n + 1; }
for (; r <= n && c >= 1; ++r, --c)
rd[i] += a[r][c];
}
ll faa = -1;
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
ll ans = 0;
if (i == j) {
ans = solve(i); // 重复, 取一次
} else if (i == 1 && j == n) {
ans = solve(i) + solve(j);
// 如果点的个数是奇数则在中间点相交, 偶数则不相交
if (n & 1) {
ans -= a[(n + 1) / 2][(n + 1) / 2];
}
} else if (i == 1) {
ans = solve(i) + solve(j);
if (j & 1) {
ans -= a[(j + 1) / 2][(j + 1) / 2];
ans -= a[n - (j + 1) / 2 + 1][n - (j + 1) / 2 + 1];
}
} else {
ll ar = 1, ac = i, br = i, bc = 1,
cr = n, cc = n - i + 1, dr = n - i + 1, dc = n,
er = 1, ec = j, fr = j, fc = 1,
gr = n, gc = n - j + 1, hr = n - j + 1, hc = n;
ans = solve(i) + solve(j);
ll dif = abs(ec - ac);
if (!(dif & 1)) ans -= a[ar + dif / 2][ac + dif / 2]; // 为偶则有交点
dif = abs(hr - br);
if (!(dif & 1)) ans -= a[br + dif / 2][bc + dif / 2];
dif = abs(gc - cc);
if (!(dif & 1)) ans -= a[cr - dif / 2][cc - dif / 2];
dif = abs(fr - dr);
if (!(dif & 1)) ans -= a[dr - dif / 2][dc - dif / 2];
}
faa = max(faa, ans);
}
}
printf("%lld", faa);
fclose(stdin);
fclose(stdout);
return 0;
}