感觉是边界问题反复看了都感觉没问题?
using namespace std;
#define int long long
const int N = 2000 + 10;
#define endl '\n'
int n, m;
int sum[N][N], a[N][N], b[N][N], c[N][N], d[N][N], dp[N][N], f[N][N]; // a:左上 b:右上 c:左下 d:右下
int s[N][N]; // 表示以 (i, j) 为左上角的 m * m 正方形
int v[N][N];
void init () {
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + v[i][j];
}
}
for (int i = 1; i <= n - m + 1; i ++) {
for (int j = 1; j <= n - m + 1; j ++) {
s[i][j] = sum[i + m - 1][j + m - 1] - sum[i - 1][j + m - 1] - sum[i + m - 1][j - 1] + sum[i - 1][j - 1];
}
}
for (int i = m; i <= n; i ++) {
for (int j = m; j <= n; j ++) {
a[i][j] = max(max(a[i - 1][j], a[i][j - 1]), s[i - m + 1][j - m + 1]);
}
for (int j = n - m + 1; j >= 1; j --) {
b[i][j] = max(max(b[i - 1][j], b[i][j + 1]), s[i - m + 1][j]);
}
}
for (int i = n - m + 1; i >= 1; i --) {
for (int j = m; j <= n; j ++) {
c[i][j] = max(max(c[i + 1][j], c[i][j - 1]), s[i][j - m + 1]);
}
for (int j = n - m + 1; j >= 1; j --){
d[i][j] = max(max(d[i + 1][j], d[i][j + 1]), s[i][j]);
}
}
for (int i = 1; i <= n - m + 1; i ++) {
for (int j = 1; j <= n; j ++) {
dp[i][i + m - 1] = max(dp[i][i + m - 1], s[i][j]);
}
}
for (int len = 1; len <= n; len ++) {
for (int i = 1; i + len - 1 <= n; i ++) {
int j = i + len - 1;
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
for (int i = 1; i <= n - m + 1; i ++) {
for (int j = 1; j <= n; j ++) {
f[i][i + m - 1] = max(f[i][i + m - 1], s[j][i]);
}
}
for (int len = 1; len <= n; len ++) {
for (int i = 1; i + len - 1 <= n; i ++) {
int j = i + len - 1;
f[i][j] = max(f[i + 1][j], f[i][j - 1]);
}
}
}
int getmax() {
int res = 0;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
res = max(res, a[i][j] + b[i][j + 1] + d[i + 1][1]);
res = max(res, a[i][j] + c[i + 1][j] + d[1][j + 1]);
res = max(res, c[1][j] + b[i][j + 1] + d[i + 1][j + 1]);
res = max(res, a[i][n] + c[i + 1][j] + d[i + 1][j + 1]);
}
}
for (int i = 1; i <= n; i ++) {
for (int j = i + m; j + m <= n; j ++) {
res = max(res, dp[1][i] + dp[i + 1][j] + dp[j + 1][n]);
res = max(res, f[1][i] + f[i + 1][j] + f[j + 1][n]);
}
}
return res;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
cin >> v[i][j];
}
}
init();
cout << getmax();
return 0;
}