您的位置:首页 > 其它

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

2013-06-06 16:23 225 查看
这是做的第二道状态压缩dp题,又学习了……

#include<stdio.h>
#include<string.h>
#define mo 10007
int dp[510][1<<6];
int n,m;

int ok(int j,int k)
{
int r1,r2,f=1,col,i;//col表示上一个颜色相同的格子的颜色,f表示上下两行相邻的是否相同。
for(i=1; i<=m; i++)
{
r1=j%2; r2=k%2;
if(r1!=r2)
f=1;
else
{
if(f==0&&col==r1)
return 0;
f=0; col=r1;
}
j=j>>1; k=k>>1;
}

return 1;
};

int main()
{
int i,j,k,ans;
while(~scanf("%d%d",&n,&m))
{
memset(dp,0,sizeof(dp));
for(i=0; i<(1<<m); i++)
dp[1][i]=1;//第一行都设为1;

for(i=2; i<=n; i++)
for(j=0; j<(1<<m); j++)
for(k=0; k<(1<<m); k++)
if(ok(j,k))
dp[i][j]=(dp[i][j]+dp[i-1][k])%mo;

ans=0;
for(i=0; i<(1<<m); i++)
ans=(ans+dp
[i])%mo;
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: