题意:给个N*N的黑白矩阵,给大小k的橡皮,求擦一次最多能有多少行列全部都是白色的。
思路:对每一行,每一列求其贡献,如果其中没有黑色格子,说明这个行或者列对任意格点为左上角的操作都有贡献,如果最后一个黑子和第一个黑子的距离超过k,则是无法覆盖的,否则,这个行或列对一下符合条件的格点具有贡献。
const int N = 2005;
int p[N][N];//以每一个点为左上角的贡献
char s[N][N];
int main()
{
//STDIN;
int n, k;
cin >> n >> k;
f(i,1,n)scanf("%s", s[i] + 1);
int res = 0;
f(i, 1, n)//计算每行对哪些点有贡献
{
int b = 0, e = 0;
f(j, 1, n)
{
if (s[i][j] == 'B')
{
if (!b)b = j;
e = j;
}
}
if (b == 0)res++;//对全局都有贡献
else if(e-b+1<=k)
{
f(j, max(1, i - k + 1), i)
f(jj, max(1, e - k + 1), b)p[j][jj]++;
}
}
f(i, 1, n)//计算每列对哪些点有贡献
{
int b = 0, e = 0;
f(j, 1, n)
{
if (s[j][i] == 'B')
{
if (!b)b = j;
e = j;
}
}
if (b == 0)res++;//对全局都有贡献
else
{
f(j, max(1, i - k + 1), i)
f(jj, max(1, e - k + 1), b)p[jj][j]++;
}
}
int ans = 0;
f(i, 1, n)f(j, 1, n)ans = max(ans, p[i][j]);
cout << ans + res << endl;
return 0;
}