hdu 4517
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4517
昨天Tencent的题目,好吧,当时悲剧地TLE了。。。。orz,今天网上搜了一下,基本上都是用dp做的。。。orz。。。
思路:sum[i][j]表示从1-i,1-j的矩阵中的'*'的个数。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }