hdu 4517

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4517

昨天Tencent的题目,好吧,当时悲剧地TLE了。。。。orz,今天网上搜了一下,基本上都是用dp做的。。。orz。。。

思路:sum[i][j]表示从1-i,1-j的矩阵中的'*'的个数。。。

View Code
 1 #include<iostream>
 2 const int N=2004;
 3 using namespace std;
 4 char map[N][N];
 5 int sum[N][N];//sum[i][j]表示从1-i,1-j的矩形中的"*"的个数
 6 
 7 int main(){
 8     int n,m;
 9     while(~scanf("%d%d",&n,&m)){
10         if(n==0&&m==0)break;
11         int x,y,count=0;
12         scanf("%d%d",&x,&y);
13         memset(sum,0,sizeof(sum));
14         for(int i=1;i<=n;i++){
15             scanf("%s",1+map[i]);
16             count=0;
17             for(int j=1;j<=m;j++){
18                 if(map[i][j]=='*')count++;
19                 sum[i][j]=count+sum[i-1][j];
20             }
21         }
22         count=0;
23         for(int i=1;i<=n;i++){
24             for(int j=1;j<=m;j++){
25                 if(i+x-1<=n&&j+y-1<=m){
26                     int ans=sum[i+x-1][j+y-1]-sum[i+x-1][j-1]-sum[i-1][j+y-1]+sum[i-1][j-1];//求x*y的面积内的'*'的个数
27                     if(ans==x*y)count++;
28                 }
29                 //一开始没判断x!=y!!!!
30                 if(i+y-1<=n&&j+x-1<=m&&x!=y){
31                     int ans=sum[i+y-1][j+x-1]-sum[i+y-1][j-1]-sum[i-1][j+x-1]+sum[i-1][j-1];
32                     if(ans==x*y)count++;
33                 }
34             }
35         }
36         printf("%d\n",count);
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/wally/p/2978148.html