小小明系列故事——游戏的烦恼

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 841    Accepted Submission(s): 296

Problem Description
 
 小小明最近在玩一款游戏,它由n*m大小的矩阵构成,矩阵上会随机产生一些黑色的点,这些点它们可能会连在一起也可能会分开,这些点的个数没有限制,但
是每个1*1方格中最多只可能有一个黑点产生。游戏要求玩家以最短的时间用x*y的小矩阵覆盖这个大矩阵,覆盖的要求有以下2点:
  1. x*y大小的小矩阵内必须有x*y个黑点。
  2. 多个小矩阵可以重叠,但是每个小矩阵放置的位置必须是独一无二的,即不同的小矩阵内的黑点不能完全相同。例如1*2的矩阵可以横着放,也可以竖着放,这两种方法是不同的,即使它们可能共用黑点。
  小小明是个粗心的孩子,他尝试了很多遍都无法将所有的符合要求的小矩阵找到,聪明的你,能不能告诉烦恼中的小小明这个大矩阵里有多少个满足要求的小矩阵呢?
 
Input
题目有多组测试数据(不多于100个);
每组测试数据的第一行包含2个正整数n和m,然后第二行是x和y(n,m,x,y的意思如题),接下来n行,每行m个字符,其中’ * ’表示黑点,’ . ’表示空白。
n和m为0则结束输入。

[Technical Specification]
0 < n, m <= 2000
0 < x, y <= 1000

 
Output
请计算并输出一共有多少个满足要求的小矩阵,每组输出占一行。
 
Sample Input
2 3
1 2
**.
.**
0 0
 
Sample Output
3
 
Source
 
刚开始进行了个普通的匹配,O(∩_∩)O~,就知道会TLE,╮(╯▽╰)╭,就是这么无奈呀!
贴一下自己丑陋的代码吧..
代码:
 #include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=;
char map[maxn][maxn];
int n,m;
bool match(int posx,int posy,int x,int y)
{
int i,j;
if(posx+x>n||posx<||posy+y>m||posy<)
return ;
for( i=posx; i<posx+x ; i++ ){
for( j=posy ; j<posy+y ; j++ ) {
if(map[i][j]!='*')return false;
}
}
return true;
} int work(int x,int y)
{
int i,j,cnt=;
for(i=;i<n;i++){
for(j=;j<m;j++){
if(match(i,j,x,y)) cnt++;
if(match(i,j,y,x)) cnt++;
}
}
return cnt;
}
int main()
{
int x,y,i;
while(scanf("%d%d",&n,&m)!=EOF,n+m!=)
{
scanf("%d%d",&x,&y);
for(i=;i<n;i++)
scanf("%s",map[i]);
printf("%d\n",work(x,y));
}
return ;
}

然后统计了一下,dp...简单的dp

代码: 不过依旧还是很挫,写到了680ms....

 #include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=;
char map[maxn][maxn];
int dp[maxn][maxn];
int n,m;
void init()
{
int i,j,cnt=;
memset(dp,,sizeof(dp));
for(i=;i<=n;i++) {
for(j=;j<=m;j++) {
if(map[i][j-]=='*')cnt++;
dp[i][j]=cnt+dp[i-][j];
}
cnt=;
}
}
int work(int x,int y){
int i,j,cnt=;
for(i=;i+x<=n;i++){
for(j=;j+y<=m;j++){
int tem=dp[i+x][j+y]-dp[i-][j+y]-dp[i+x][j-]+dp[i-][j-];
if(tem==((x+)*(y+)))cnt++;
}
}
return cnt;
}
int main()
{
int x,y,i;
while(scanf("%d%d",&n,&m),n+m!=)
{
scanf("%d%d",&x,&y);
x--,y--;
for(i=;i<=n;i++)
scanf("%s",map[i]);
init();
if(x==y) printf("%d\n",work(x,y));
else printf("%d\n",work(x,y)+work(y,x)); }
return ;
}

hdu ---(4517)小小明系列故事——游戏的烦恼(Dp)的更多相关文章

  1. 小小明系列故事——游戏的烦恼(hdu 4517)

    小小明系列故事--游戏的烦恼 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  2. HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)

    HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...

  3. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

  5. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  6. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  7. hdu 4542 小明系列故事——未知剩余系 反素数 + 打表

    小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Prob ...

  8. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  9. HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)

    Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则:  1.如果小明 ...

随机推荐

  1. css做的后台管理页面,不考虑ie8一下的

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 对 strcpy_s 若干测试

    今天发现如果strcpy这函数,目标buffer太小,会有意想不到的崩溃.而且不容易调试.以后尽量要用strcpy_s了. strcpy_s是strcpy的更安全的版本 1.当目标字符串参数是一个字符 ...

  3. 集成学习(Ensembling Learning)

    集成学习(Ensembling Learning) 标签(空格分隔): 机器学习 Adabost 对于一些弱分类器来说,如何通过组合方法构成一个强分类器.一般的思路是:改变训练数据的概率分布(权值分布 ...

  4. 协方差Covariance的表述推导

    今天想了一下关于概率论的一维数据期望.方差以及高维数据的矩阵表示,突然想到为什么在一维中 方差的表示为:V(x) = E((x-E(x))2) 而到了高维,这样的表述就成了协方差呢?V(X) = E( ...

  5. [CF724B]Batch Sort(暴力,思维)

    题目链接:http://codeforces.com/contest/724/problem/B 题意:给出n*m的数字阵,每行数都是1-m的全排列,最多可以交换2个数一次,整个矩阵可以交换两列一次. ...

  6. Java代码规范性

    ---------------------------------------------------------------------------------------------------- ...

  7. MySQL子查询(SubQuery)

    由比较运算符引发的子查询,若括号内的子查询结果为多个,要在括号前加上ANY/SOME/ALL 由[NOT]IN引发的子查询, =ANY与IN等效       !=ALL / <>ALL与N ...

  8. FLASH CC 2015 CANVAS 导出音频问题

    1,导入音频无法成功发布(软件假死) 解决办法:先用个格式工厂重新压缩 在导入软件 发布 2, 音频 长度小于1秒(左右)的时候,导出后音频会变成  “哧”的一声,  估计和FLASH软件内部的音频编 ...

  9. iOS - OC NSFileManager 文件管理

    前言 @interface NSFileManager : NSObject @interface NSFileHandle : NSObject <NSSecureCoding> NSF ...

  10. URLConnection 使用

    统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址.超文本链路由统一资源定位符URL维持.URL的格式是: <M ...