hdu1400Mondriaan's Dream

这是一道很好的题目,我不会做,所以答案是从网上弄的。

把人家的代码又重新写了一遍,发现他的也是错的——可能跟编译器有关,但是为什么提交的时候可以通过呢???神奇

就因为dp[i][j]这个错了

通过的代码

#include<iostream>
#include<cstring>
using namespace std;
const int mm=1<<13;
long long dp[14][mm];
int w,h;
bool line_one(int x)
{
    for(int i=0;i<w;)
    if((x&(1<<i))>0)
    {
        if(i==w-1||(x&(1<<(i+1)))==0)
        return 0;
        i+=2;
    }else i++;
    return 1;
}
bool trans(int a,int b)
{
    for(int i=0;i<w;)
    {
        if((a&(1<<i))>0)
        {
            if((b&(1<<i))==0)i++;
            else if(i==w-1||(a&(1<<(i+1)))==0||(b&(1<<(i+1)))==0)return 0;
            else i+=2;
        }
        else if((b&(1<<i))>0)i++;
        else return 0;
    }
    return 1;
}
int main()
{
    while(cin>>w>>h)
    {
        if(w==0&&h==0)break;
        if(w>h){int zz=w;w=h;h=zz;}
        int z=1<<w;
        for(int i=0;i<z;i++)
        if(line_one(i))///判断一层状态合法
        dp[1][i]=1;
        for(int i=2;i<=h;i++)
        {
            for(int j=0;j<z;j++)
            { dp[i][j]=0;
             for(int k=0;k<z;k++)
             if(trans(k,j))///判断k状态能否转化到j状态
             dp[i][j]+=dp[i-1][k];
            }
        }

        cout<<dp[h][z-1]<<"\n";
    }
}

 

 

posted @ 2013-09-05 08:55  龙城星  阅读(171)  评论(0编辑  收藏  举报