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;}

原创粉丝点击