BZOJ 1879: [Sdoi2009]Bill的挑战|状压DP
2016-02-25 19:28
381 查看
看完题解感觉思路很正常,为什么自己想不出来捏..
F[i][j]表示i个字符都匹配好了时状态为j(状压表示)的方案数
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 1000003 using 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; }
相关文章推荐
- POJ 3254 - Corn Fields [状压DP]
- poj 2836
- poj 3254
- POJ 2441
- 2014 西安邀请赛状压DP
- Mega Man’s Missions
- 【2015新手赛网络赛】 1004 Good Subsets
- HDU 5561 【2015合肥现场赛】 Kingdom of Tree
- 关于AC自动机与DP的总结
- HDU 5135 Little Zu Chongzhi's Triangles (2014年广州赛区现场赛I题)
- 【PA2014】【BZOJ3717】Pakowanie
- 【SCOI2007】【BZOJ1072】排列perm
- 【CERC2012】【BZOJ4057】Kingdoms
- 【SDOI2009】【BZOJ1879】Bill的挑战
- Codevs2880 送外卖
- codeforces #302 Remembering Strings (dp)
- hdu 5418 Victor and World 状压DP
- Codeforces Round #235 (Div. 2) D. Roman and Numbers(状压dp)
- Codeforces Round #302 (Div. 2) E. Remembering Strings(状压dp)
- POJ 3254 Corn Fields (状压DP)