题目链接:http://codeforces.com/contest/738/problem/B
题意:问多少个0的方向,使得方向上至少有一个1。
四个方向统计一遍前缀和,向上向左正着记,向下向右倒着记。判断某0点是不是大于等于1。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 1010; 5 int G[maxn][maxn]; 6 int dp[5][maxn][maxn]; 7 int n, m; 8 int ret; 9 10 int main() { 11 // freopen("in", "r", stdin); 12 while(~scanf("%d%d",&n,&m)) { 13 for(int i = 1; i <= n; i++) { 14 for(int j = 1; j <= m; j++) { 15 scanf("%d", &G[i][j]); 16 } 17 } 18 ret = 0; 19 for(int i = 1; i <= n; i++) { 20 for(int j = 1; j <= m; j++) { 21 dp[0][i][j] = G[i][j] + dp[0][i][j-1]; 22 dp[1][i][j] = G[i][j] + dp[1][i-1][j]; 23 } 24 } 25 26 for(int i = n; i >= 1; i--) { 27 for(int j = m; j >= 1; j--) { 28 dp[2][i][j] = G[i][j] + dp[2][i][j+1]; 29 dp[3][i][j] = G[i][j] + dp[3][i+1][j]; 30 } 31 } 32 33 for(int i = 1; i <= n; i++) { 34 for(int j = 1; j <= m; j++) { 35 if(G[i][j] == 0) { 36 for(int k = 0; k <= 3; k++) { 37 if(dp[k][i][j] != 0) ret++; 38 } 39 } 40 } 41 } 42 printf("%d\n", ret); 43 } 44 return 0; 45 }