poj 3254(状态压缩dp)
来源:互联网 发布:快ping软件 编辑:程序博客网 时间:2024/05/16 07:57
/* dp[i][k] =dp[i-1][j] //j状态可以到k状态 */#include <stdio.h>#include <string.h>#define mod 100000000int stk[500];int cur[15];int dp[15][500];int m,n;int top;bool isok(int x){ if(x&(x<<1)) return 0; return 1; }void init(){ top=0; for(int i=0;i<(1<<n);i++) { if(isok(i)) stk[++top]=i; } //printf("(top)%d\n",top);}bool match(int x,int k){ if(x&cur[k])return 0; return 1; }int main(){ int x; while(scanf("%d%d",&m,&n)!=EOF) { init(); memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) { cur[i]=0; for(int j=1;j<=n;j++) { scanf("%d",&x); if(x==0) cur[i]+=(1<<(n-j)); } } // for(int i=1;i<=m;i++) // { // printf("%d\n",cur[i]); // } for(int i=1;i<=top;i++) { if(match(stk[i],1)) dp[1][i]=1; } for(int i=2;i<=m;i++) { for(int k=1;k<=top;k++) { if(!match(stk[k],i)) continue; for(int j=1;j<=top;j++) { if(stk[k]&stk[j]) continue; if(!match(stk[j],i-1)) continue; dp[i][k] = (dp[i][k]+dp[i-1][j])%mod; } } } int ans=0; for(int k=1;k<=top;k++) { ans=(ans+dp[m][k])%mod; } printf("%d\n",ans); } return 0;}