BZOJ 1879: [Sdoi2009]Bill的挑战|状压DP

来源:互联网 发布:淘宝个体工商户的优势 编辑:程序博客网 时间:2024/06/05 14:38

看完题解感觉思路很正常,为什么自己想不出来捏..
F[i][j]表示i个字符都匹配好了时状态为j(状压表示)的方案数

#include<cstdio>  #include<cstdlib>  #include<cstring>  #include<cmath>  #include<queue>  #include<set>  #include<map>  #include<vector>  #include<algorithm>  #include<iostream>  #define R 1000003using namespace std;int sc()  {      int i=0,f=1; char c=getchar();      while(c>'9'||c<'0'){if(c=='-')f=-1; c=getchar();}      while(c>='0'&&c<='9') i=i*10+c-'0',c=getchar();      return i*f;  }  char s[15][55];  int f[55][33333];int g[55][33];int main(){    int T=sc();    while(T--)    {        int n=sc(),K=sc(),L,N;        memset(f,0,sizeof(f));        memset(g,0,sizeof(g));        for(int i=0;i<n;i++)scanf("%s",s[i]);        L=strlen(s[1]);        for(int i=0;i<L;i++)            for(int j=0;j<n;j++)                for(int k=0;k<26;k++)                    if(s[j][i]=='?'||s[j][i]=='a'+k)                        g[i][k]|=(1<<j);        N=1<<n;f[0][N-1]=1;        for(int i=0;i<L;i++)            for(int j=0;j<N;j++)                if(f[i][j])                    for(int k=0;k<26;k++)                        (f[i+1][j&g[i][k]]+=f[i][j])%=R;        int ans=0;        for(int i=0;i<N;i++)        {            int cnt=0;            for(int j=1;j<N;j<<=1)if(j&i)cnt++;            if(cnt==K)(ans+=f[L][i])%=R;        }        cout << ans << endl;    }    return 0;}
0 0
原创粉丝点击