hdu 1400 Mondriaan's Dream

1317 단어
hdu 1400  Mondriaan's Dream
poj에 이 문제와 유사한 문제가 있는데 상태는 dp로 압축되고 네모난 블록의 모양은 1*2이어야 하기 때문에 각 줄의 방치 상황은 상부의 방치 상황과 가장 많이 관련이 있다. dp[i][j]는 제i층에 방치된 상황이 j인 방법수를 나타낸다. j 중 1은 0을 방치하지 않는 것을 의미한다.
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

long long dp[11][1<<11];
int h,w;

void init(int state,int id)
{
    if(id>=w) { dp[0][state]++;return; }
    init(state<<1,id+1);
    if(id+2<=w) init(state<<2|3,id+2); //   
}
void dfs(int r,int id,int pre,int now)
{
    if(id>=w){
        dp[r][now]+=dp[r-1][pre];
        return;
    }
    dfs(r,id+1,pre<<1|1,now<<1);   //   
    if(id+1<w) dfs(r,id+2,pre<<2|3,now<<2|3); //   
    dfs(r,id+1,pre<<1,now<<1|1);  //   
}
int main()
{
    while(scanf("%d%d",&h,&w)==2,(h||w))
    {
        if((h*w)%2){
            printf("0
");continue; } memset(dp,0,sizeof(dp)); init(0,0); // for(int i=0;i<(1<<w);i++) // cout<<i<<" dd "<<dp[0][i]<<endl; for(int i=1;i<h;i++) dfs(i,0,0,0); printf("%I64d
",dp[h-1][(1<<w)-1]); } return 0; }

좋은 웹페이지 즐겨찾기