题号 NC53676
名称 「土」秘法地震
来源 牛客小白月赛19
解题思路
题目要求:求出有多少个 区域内里面有建筑物。
f[i][j] 为前 i 行前 j 列区域中建筑物的数目。f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a,其中 a 表示地点 (i,j) 建筑物的数目,即 a = 0 或 a = 1。
以地点 (i,j) 为右下角的 区域中,建筑物的数目
cnt 为:cnt = f[i][j] - f[i-k][j] - f[i][j-k] + f[i-k][j-k]。
如果 cnt > 0,表示这块区域有建筑物,满足题意,累加计入结果 ans 中。
C++代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> f(n+1, vector<int>(m+1, 0));
string s;
for(int i=1; i<=n; ++i){
cin >> s;
for(int j=1; j<=m; ++j){
f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1];
if(s[j-1] == '1')
++f[i][j];
}
}
int ans = 0;
for(int i=k; i<=n; ++i){
for(int j=k; j<=m; ++j){
int cnt = f[i][j] - f[i-k][j] - f[i][j-k] + f[i-k][j-k];
if(cnt > 0)
++ans;
}
}
cout << ans << endl;
return 0;
} 
京公网安备 11010502036488号