双倍经验过了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1510;
int n,m,k,mp[mxn][mxn],a[mxn][mxn],b[mxn][mxn],c[mxn][mxn],d[mxn][mxn];
signed main(){
ios::sync_with_stdio(0);
cin>>n>>k;
m=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>mp[i][j];
mp[i][j]+=mp[i-1][j]+mp[i][j-1]-mp[i-1][j-1];
}
for(int i=n;i>=k;i--)
for(int j=m;j>=k;j--)
mp[i][j]-=mp[i-k][j]+mp[i][j-k]-mp[i-k][j-k];
for(int i=k;i<=n;i++)
for(int j=k;j<=m;j++)
a[i][j]=max(mp[i][j],max(a[i-1][j],a[i][j-1]));
for(int i=k;i<=n;i++)
for(int j=m;j>=k;j--)
b[i][j]=max(mp[i][j],max(b[i-1][j],b[i][j+1]));
for(int i=n;i>=k;i--)
for(int j=k;j<=m;j++)
c[i][j]=max(mp[i][j],max(c[i+1][j],c[i][j-1]));
for(int i=n;i>=k;i--)
for(int j=m;j>=k;j--)
d[i][j]=max(mp[i][j],max(d[i+1][j],d[i][j+1]));
int ans=0;
for(int i=k;i<=n-k;i++)
for(int j=k;j<=m-k;j++){
ans=max(ans,a[i][j]+b[i][j+k]+c[i+k][m]);
ans=max(ans,a[i][m]+c[i+k][k]+d[i+k][j+k]);
ans=max(ans,a[i][j]+b[n][j+k]+c[i+k][j]);
ans=max(ans,a[n][j]+b[i][j+k]+d[i+k][j+k]);
}
for(int i=k;i<=n-k;i++)
for(int j=k+k;j<=m-k;j++)
ans=max(ans,a[n][j-k]+b[n][j+k]+mp[i][j]);
for(int i=k+k;i<=n-k;i++)
for(int j=k;j<=m-k;j++)
ans=max(ans,a[i-k][m]+c[i+k][m]+mp[i][j]);
cout<<ans;
return 0;
}