sdut 2619 地板砖(状态压缩dp)

这是做的第二道状态压缩dp题,又学习了……

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define mo 10007
 4 int dp[510][1<<6];
 5 int n,m;
 6 
 7 int ok(int j,int k)
 8 {
 9   int r1,r2,f=1,col,i;//col表示上一个颜色相同的格子的颜色,f表示上下两行相邻的是否相同。
10   for(i=1; i<=m; i++)
11   {
12      r1=j%2; r2=k%2;
13      if(r1!=r2)
14      f=1;
15      else
16      {
17          if(f==0&&col==r1)
18          return 0;
19          f=0; col=r1;
20      }
21      j=j>>1; k=k>>1;
22   }
23 
24   return 1;
25 };
26 
27 int main()
28 {
29     int i,j,k,ans;
30     while(~scanf("%d%d",&n,&m))
31     {
32         memset(dp,0,sizeof(dp));
33         for(i=0; i<(1<<m); i++)
34         dp[1][i]=1;//第一行都设为1;
35 
36         for(i=2; i<=n; i++)
37         for(j=0; j<(1<<m); j++)
38         for(k=0; k<(1<<m); k++)
39         if(ok(j,k))
40         dp[i][j]=(dp[i][j]+dp[i-1][k])%mo;
41 
42         ans=0;
43         for(i=0; i<(1<<m); i++)
44         ans=(ans+dp[n][i])%mo;
45         printf("%d\n",ans);
46     }
47 }

 

posted @ 2013-06-06 16:23  水门  阅读(188)  评论(0编辑  收藏  举报