题面
题意:
- 给出一个 n* 的 01 矩阵,要用一个 1*m 的矩阵去覆盖一段 0,问方案数。
思路:
- 利用前缀和维护每一行的前缀和。接着遍历每一行,利用前缀和是否为0来判断是否可以插入,是就加1,最后输出方案数即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e3 + 10;
char mp[MAXN][MAXN];
int sum[MAXN][MAXN];
char s[MAXN];
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", mp[i] + 1);
for (int j = 1; j <= n; j++) {
sum[i][j] = sum[i][j - 1] + (mp[i][j] - '0');
}
}
scanf("%s", s);
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = m; j <= n; j++) {
if (sum[i][j] - sum[i][j - m] == 0) {
ans++;
}
}
}
printf("%d\n", ans);
return 0;
}