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

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. HashCheck

    https://github.com/gurnec/HashCheck

  2. [C程序设计语言]第四部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. phpcms 在后台增加了一个模型的话,在数据库中就会相应的增加数据库表

    在phpcms后台管理系统中,我们如果增加一个新的模型的话,例如名为:测试模型,英文名:test 在添加完成后,我们在数据库中发现增加了两个数据表:v9_test,v9_test_data;

  4. iOS - Swift NSSize 尺寸

    前言 结构体,这个结构体用来表示事物的宽度和高度. public typealias NSSize = CGSize public struct CGSize { public var width: ...

  5. iOS - Swift 与 Objective-C 互相操作

    前言 在 Swift 语言中,我们可以使用 Objective-C.C 语言编写代码,我们可以导入任意用 Objective-C 写的 Cocoa 平台框架.Objective-C 框架或 C 类库. ...

  6. effect c++ 口诀。

    常用条款,写成口诀,记住.知其所以,也要时时使用. 1)习惯c++: 联替const初. 2)构造,复制,析构: 要知默,构赋析. 若不需,明拒绝. 构析不调虚. 异不逃析构. 基析要虚函. 赋值操, ...

  7. java实现excel与mysql的导入导出

    注意:编码前先导入poi相关jar包 1 /** * 读excel 到list * * @param file excel file * @param fields 字段数组 * @return * ...

  8. boost线程的问题:

    可以看看这里:http://blog.csdn.net/misskissc/article/details/9859753 我的总结: 1,用thread类来创建一个线程,它的构结函数 : (1)th ...

  9. 使用Ant打包工具 基本介绍

    由于使用java,javac,jar等工具进行编译打包,即繁琐低效又容易出错,因此Ant出现了. Ant的出现就是专门为了打包编译java代码的,使用之前得稍微学一下.Ant的运行起来主要是依靠配置文 ...

  10. Android手机分辨率基础知识(DPI,DIP计算)二

    dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...