【HDU】1400 Mondriaan's Dream

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<vector>

 4 #include<algorithm>

 5 typedef __int64 LL;

 6 using namespace std;

 7 #define MAXN 1<<11

 8 #define MAXM 15

 9 int n,m;

10 vector<int>G[MAXN];

11 LL dp[MAXM][MAXN];

12 bool OK(int a,int b)

13 {

14     int i,temp,cnt;

15     temp=a|b;

16     for(i=0;i<m;i++)

17     {

18         if(!(temp&(1<<i)))

19             return false;

20     }

21     temp=a&b;

22     for(i=cnt=0;i<m;i++)

23     {

24         if(temp&(1<<i))

25             cnt++;

26         else

27         {

28             if(cnt&1)

29                 return false;

30             cnt=0;

31         }

32     }

33     return !(cnt&1);

34 }

35 void DoIt()

36 {

37     int i,j,k;

38     memset(dp,0,sizeof(dp));

39     dp[0][(1<<m)-1]=1;

40     for(i=1;i<=n+1;i++)

41     {

42         for(j=0;j<(1<<m);j++)

43         {

44             for(k=0;k<G[j].size();k++)

45                 dp[i][j]+=dp[i-1][G[j][k]];

46         }

47     }

48     printf("%I64d\n",dp[n+1][0]);

49 }

50 void Init()

51 {

52     int i,j;

53     for(i=0;i<(1<<m);i++)

54     {

55         G[i].clear();

56         for(j=0;j<(1<<m);j++)

57         {

58             if(OK(i,j))

59                 G[i].push_back(j);

60         }

61     }

62 }

63 int main()

64 {

65     while(scanf("%d%d",&n,&m),n||m)

66     {

67         if(n&m&1)

68             puts("0");

69         else

70         {

71             if(m>n)

72                 swap(n,m);

73             Init();

74             DoIt();

75         }

76     }

77     return 0;

78 }

你可能感兴趣的:(HDU)