考虑如何O(1)判断每个点的贡献
#include <bits/stdc++.h>
using namespace std;
const int maxn=2009;
int r[maxn][maxn],d[maxn][maxn],n,k;
int sum1[maxn][maxn],sum2[maxn][maxn];
char s[maxn][maxn];
int main()
{
cin >> n >> k;
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
r[i][j]=r[i][j-1]+(s[i][j]=='B');
d[j][i]=d[j][i-1]+(s[i][j]=='B');
}
int tot=0,ans=0;
for(int i=1;i<=n;i++){
if(r[i][n]==0) tot++;
if(d[i][n]==0) tot++;
}
for(int i=1;i<=n;i++)
for(int j=1;j+k-1<=n;j++)
{
//第j到j+k-1个字母被覆盖
sum1[i][j]=sum1[i-1][j]+( r[i][j+k-1]-r[i][j-1]==r[i][n]&&r[i][n]!=0 );
sum2[i][j]=sum2[i-1][j]+( d[i][j+k-1]-d[i][j-1]==d[i][n]&&d[i][n]!=0 );
}
for(int i=1;i<=n-k+1;i++)
for(int j=1;j<=n-k+1;j++)
ans=max(ans, tot+sum1[i+k-1][j]-sum1[i-1][j]+sum2[j+k-1][i]-sum2[j-1][i]);
cout << ans;
}