Codeforces Round #141 (Div. 2) C. Fractal Detector(神奇的状压DP)(好题)

原创 2015年07月09日 21:10:10

C. Fractal Detector
time limit per test
4 seconds
memory limit per test
256 megabytes
standard input
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:

  1. He divides the sheet into four identical squares. A part of them is painted black according to the fractal pattern.
  2. 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.


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 "*".


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)
6 11
4 4

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.

大致题意:行列500的黑白方格内有多少个分形图形 ,分形图形的定义在题目中给了

思路:拿到这个题目完全没思路啊,反正知道是dp,然后把每个分形图形都搞成一个状态,首先需要xy坐标,然后还需要一个基本分形图形,一共有1<<4种基本分形图形(全黑和全白也算),然后这样还不够,还要搞一个状态表示是多少个基本分形嵌套过来的,就是k阶分形。所以用四维状压dp可以做:bool dp[N][N][1<<4][10];


//GNU C++	Accepted	3742 ms	47700 KB
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cstdio>
#include <ctime>
#include <bitset>
#include <algorithm>
#define SZ(x) ((int)(x).size())
#define ALL(v) (v).begin(), (v).end()
#define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i)
#define REP(i,n) for ( int i=1; i<=int(n); i++ )
using namespace std;
typedef long long ll;

const int N = 550;
int n,m;
char mp[N][N];
bool dp[N][N][1<<4][10];
int main()
        dp[i][j][(1<<4)-1][0] = (mp[i][j] == '*');
        for(int mask = 0;mask < (1<<4)-1;mask++) dp[i][j][mask][0] = (mp[i][j] == '.');
    for(int mask = 0;mask < (1<<4);mask++)
        int d = (1<<(k-1));
        REP(x,n) REP(y,m)
            int nx[4]={x,x,x+d,x+d},ny[4]={y,y+d,y,y+d};
            bool flag = 1;
            for(int p = 0;p <= 3;p++)
                int xx = nx[p],yy = ny[p];
                if(xx > n || yy > m)
                    flag = 0;
                if(mask & (1<<p)) flag &= dp[xx][yy][(1<<4)-1][k-1];
                else flag &= dp[xx][yy][mask][k-1];
            dp[x][y][mask][k] = flag;
    int ans = 0;
    REP(x,n) REP(y,m) for(int mask = 0;mask < (1<<4);mask++)
    for(int k = 2;k <= 9;k++) ans += dp[x][y][mask][k];



CF 141 Div2 C Fractal Detector(状态压缩DP)

C. Fractal Detector time limit per test 4 seconds memory limit per test 256 megabytes ...
  • fp_hzq
  • fp_hzq
  • 2012年10月23日 19:16
  • 822

Codeforces Round #321 (Div. 2)【A 最长不减子串】【B tow-pointer】【C dfs】【D 状压DP】

传送门:B. Kefa and Company 题意: 一个人有n个朋友,他想找他的n个朋友来玩,但是朋友间会相互攀比,就不能带他们的财富差距大于或等于d的, 他的朋友间还有好友度 求来的最大的朋友...

Codeforces Round #242 (Div. 2) C: Magic Formulas 神奇的异或算式

原题链接:Codeforces 424C - Magic Formulas 题目大意: 大致思路:

Codeforces 615C Running Track (Round #338 (Div. 2) C题) Trie + dp

题意 给你两个字符串t,s 你的目标是使用尽量少的t拼出s 对于一个t,你可以做的是,只选取其中一个子串,正着或反着拼到s上 最后需要拼出完整的s 思路 首先,题解说了一句贪心。。。然后我怎么也想不明...

Codeforces Round #235 (Div. 2) D. Roman and Numbers(状压dp)

Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes ...

Codeforces Round #141 (Div. 2) B. Two Tables 枚举

You've got two rectangular tables with sizes na × ma and nb × mb cells. The tables consist of zero...

【CodeForce】Codeforces Round #141 (Div. 2) B. Two Tables

第二次熬夜做题,发现这一次的阅读量好大,英语差的连题目都看不懂。。。好不容易看懂了一个,代码写了我两个小时,哎.....不解释了。 CF比赛连接 Codeforces Round #141 (Div...

Codeforces Round #302 (Div. 2) E. Remembering Strings(状压dp)

E. Remembering Strings time limit per test 2 seconds memory limit per test 256 megabytes...

【Codeforces Round 374 (Div 2)C】【DAG上的DP】Journey 有向无环图从1到n时刻T内的最多经过点数

C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input ...

【Codeforces Round 363 (Div 2) C】【简单DP】Vacations 一天运动 一天学习最少休息日数

C. Vacations time limit per test 1 second memory limit per test 256 megabytes input...
您举报文章:Codeforces Round #141 (Div. 2) C. Fractal Detector(神奇的状压DP)(好题)