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 }