CF 141 Div2 C Fractal Detector(状态压缩DP)
2012-10-23 19:16
471 查看
C. Fractal Detector
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Little Vasya likes painting fractals very much.
He does it like this. First the boy cuts out a 2 × 2-cell square out of squared paper. Then he paints some cells black. The boy calls the cut out square a fractal pattern.
Then he takes a clean square sheet of paper and paints a fractal by the following algorithm:
He divides the sheet into four identical squares. A part of them is painted black according to the fractal pattern.
Each square that remained white, is split into 4 lesser white squares, some of them are painted according to the fractal pattern. Each square that remained black, is split into 4 lesser black squares.
In each of the following steps step 2 repeats. To draw a fractal, the boy can make an arbitrary positive number of steps of the algorithm. But he need to make at least two steps. In other words step 2 of the algorithm must
be done at least once. The resulting picture (the square with painted cells) will be a fractal. The figure below shows drawing a fractal (here boy made three steps of the algorithm).
One evening Vasya got very tired, so he didn't paint the fractal, he just took a sheet of paper, painted a n × m-cell field. Then Vasya paint some
cells black.
Now he wonders, how many squares are on the field, such that there is a fractal, which can be obtained as described above, and which is equal to that square. Square is considered equal to some fractal if they consist of the same amount of elementary not divided
cells and for each elementary cell of the square corresponding elementary cell of the fractal have the same color.
Input
The first line contains two space-separated integers n, m (2 ≤ n, m ≤ 500) —
the number of rows and columns of the field, correspondingly.
Next n lines contain m characters each — the description
of the field, painted by Vasya. Character "." represents a white cell, character "*"
represents a black cell.
It is guaranteed that the field description doesn't contain other characters than "." and "*".
Output
On a single line print a single integer — the number of squares on the field, such that these squares contain a drawn fractal, which can be obtained as described above.
Sample test(s)
input
output
input
output
Note
The answer for the first sample is shown on the picture below. Fractals are outlined by red, blue and green squares.
The answer for the second sample is 0. There is no fractal, equal to the given picture.
题目:http://codeforces.com/contest/228/problem/C
题意:这题题意表示我理解能力弱了??题目就是描述一种分型,将一个正方形平分成4分,任何选几个涂成黑色,然后不断的进行同样的步骤,每次涂色方案与第一次相同,全是黑色的就不用涂了。。。。
分析:对这种类型不大熟悉,并不能一下子看出是状态压缩DP,不过猜得出来是DP,假设f[ i ][ j ][ t ][mask]表示(i,j)这个格子为左上角,长度为2^t的正方形的分型情况,也就是那几个格子是黑色的,然后通过枚举长度,就可以转移了,具体还是比较简单的。。。。
PS:这题想了好久没思路,稍微瞄了一眼题解,想到了思路,然后就开始敲了,敲完后就悲剧了,不断的wa。。。通过看数据,发现好像我理解错了,重新看了几遍题目都不知道哪错了= =,后来不得以看别人代码,才发现第二段没仔细看,并不是只有图上的那种情况是分型。。。。感觉重新敲,最后还由于长度限制小了wa了一次 T_T,能不能再弱点
代码:
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Little Vasya likes painting fractals very much.
He does it like this. First the boy cuts out a 2 × 2-cell square out of squared paper. Then he paints some cells black. The boy calls the cut out square a fractal pattern.
Then he takes a clean square sheet of paper and paints a fractal by the following algorithm:
He divides the sheet into four identical squares. A part of them is painted black according to the fractal pattern.
Each square that remained white, is split into 4 lesser white squares, some of them are painted according to the fractal pattern. Each square that remained black, is split into 4 lesser black squares.
In each of the following steps step 2 repeats. To draw a fractal, the boy can make an arbitrary positive number of steps of the algorithm. But he need to make at least two steps. In other words step 2 of the algorithm must
be done at least once. The resulting picture (the square with painted cells) will be a fractal. The figure below shows drawing a fractal (here boy made three steps of the algorithm).
One evening Vasya got very tired, so he didn't paint the fractal, he just took a sheet of paper, painted a n × m-cell field. Then Vasya paint some
cells black.
Now he wonders, how many squares are on the field, such that there is a fractal, which can be obtained as described above, and which is equal to that square. Square is considered equal to some fractal if they consist of the same amount of elementary not divided
cells and for each elementary cell of the square corresponding elementary cell of the fractal have the same color.
Input
The first line contains two space-separated integers n, m (2 ≤ n, m ≤ 500) —
the number of rows and columns of the field, correspondingly.
Next n lines contain m characters each — the description
of the field, painted by Vasya. Character "." represents a white cell, character "*"
represents a black cell.
It is guaranteed that the field description doesn't contain other characters than "." and "*".
Output
On a single line print a single integer — the number of squares on the field, such that these squares contain a drawn fractal, which can be obtained as described above.
Sample test(s)
input
6 11 ......*.*** *.*.*....** .***....*.* ..***.*.... .*.*.....** ......*.*..
output
3
input
4 4 ..** ..** .... ....
output
0
Note
The answer for the first sample is shown on the picture below. Fractals are outlined by red, blue and green squares.
The answer for the second sample is 0. There is no fractal, equal to the given picture.
题目:http://codeforces.com/contest/228/problem/C
题意:这题题意表示我理解能力弱了??题目就是描述一种分型,将一个正方形平分成4分,任何选几个涂成黑色,然后不断的进行同样的步骤,每次涂色方案与第一次相同,全是黑色的就不用涂了。。。。
分析:对这种类型不大熟悉,并不能一下子看出是状态压缩DP,不过猜得出来是DP,假设f[ i ][ j ][ t ][mask]表示(i,j)这个格子为左上角,长度为2^t的正方形的分型情况,也就是那几个格子是黑色的,然后通过枚举长度,就可以转移了,具体还是比较简单的。。。。
PS:这题想了好久没思路,稍微瞄了一眼题解,想到了思路,然后就开始敲了,敲完后就悲剧了,不断的wa。。。通过看数据,发现好像我理解错了,重新看了几遍题目都不知道哪错了= =,后来不得以看别人代码,才发现第二段没仔细看,并不是只有图上的那种情况是分型。。。。感觉重新敲,最后还由于长度限制小了wa了一次 T_T,能不能再弱点
代码:
#include<cstdio> #include<iostream> using namespace std; const int mm=555; int f[mm][mm][11]; int i,j,k,l,n,m,ans; char c; int check(int x,int y,int l) { if(x+l>=n||y+l>=m)return -1; int d[4]={f[x][y][k-1],f[x][y+l][k-1],f[x+l][y][k-1],f[x+l][y+l][k-1]}; int i,ret,s; for(i=0;i<4;++i) if(d[i]<0)return -1; for(i=0;i<4;++i) if(d[i]!=15)break; if(i==4)return 15; s=d[i]; for(ret=i=0;i<4;++i) if(d[i]!=15) { if(d[i]!=s)return -1; } else ret|=1<<i; if(l!=1&&s!=ret)return -1; return ret; } int main() { while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;++i) for(j=0;j<m;++j) { scanf(" %c",&c); f[i][j][0]=(c=='*')?15:0; } ans=0; for(k=1;(l=(1<<k))<=n&&l<=m;++k) for(i=0;i<n;++i) for(j=0;j<m;++j) ans+=(f[i][j][k]=check(i,j,l>>1))>-1&&k>1; printf("%d\n",ans); } return 0; }
相关文章推荐
- Codeforces Round #363 (Div. 1) C. LRU(状态压缩dp)
- CF 453B状态压缩dp
- codeforces round 321 div2 D Kefa and Dishes(状态压缩dp)
- div 2 199 D 状态压缩dp 轮廓线很好写
- CF 259div2 D (状态压缩dp)
- CF 453B Little Pony and Harmony Chest 解题报告(状态压缩DP)
- CF 417D - Cunning Gena--状态压缩DP
- CF - 580D. Kefa and Dishes - 状态压缩DP
- 状态压缩DP SRM 667 Div1 250
- CF 327E(Axis Walking-状态压缩Dp-lowbit的使用)
- E. Vladik and cards Codeforces Round #384 (Div. 2) 好题 二分+(贪心+状态压缩DP)判断
- Codeforces Round #235 (Div. 2) D. Roman and Numbers(状态压缩DP)
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes 位 状态压缩 dp
- Codeforces Round #108 (Div. 2)——状态压缩DP+spfa+dfs——Garden
- CF 327E(Axis Walking-状态压缩Dp-lowbit的使用)
- 2009 ACM/ICPC 武汉赛区G题解题报告(状态压缩 dp )
- hdu4628(状态压缩DP)
- H - Most Powerful (状态压缩dp)
- ZOJ-3777 Problem Arrangement(dp状态压缩)
- poj3254 状态压缩dp