bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
2016-02-29 11:19
615 查看
Description
Input
本题包含多组数据。 第一行:一个整数T,表示数据的个数。 对于每组数据: 第一行:两个整数,N和K(含义如题目表述)。 接下来N行:每行一个字符串。
Output
1 2 1 a? ?b
Sample Input
50
Sample Output
对于30%的数据,T ≤ 5,M ≤ 5,字符串长度≤ 20;
对于70%的数据,T ≤ 5,M ≤ 13,字符串长度≤ 30;
对于100%的数据,T ≤ 5,M ≤ 15,字符串长度≤ 50。
【思路】
状压DP
设f[i][s]表示前i-1个已经匹配,且匹配集合为s时的方案数。预处理出g[i][j]表示长度为i-1且最后一个字符为j的字符串集合。则有转移方程如下:
f[i+1][s&g[i][k]]+=f[i][j]
【代码】
Input
本题包含多组数据。 第一行:一个整数T,表示数据的个数。 对于每组数据: 第一行:两个整数,N和K(含义如题目表述)。 接下来N行:每行一个字符串。
Output
1 2 1 a? ?b
Sample Input
50
Sample Output
对于30%的数据,T ≤ 5,M ≤ 5,字符串长度≤ 20;
对于70%的数据,T ≤ 5,M ≤ 13,字符串长度≤ 30;
对于100%的数据,T ≤ 5,M ≤ 15,字符串长度≤ 50。
【思路】
状压DP
设f[i][s]表示前i-1个已经匹配,且匹配集合为s时的方案数。预处理出g[i][j]表示长度为i-1且最后一个字符为j的字符串集合。则有转移方程如下:
f[i+1][s&g[i][k]]+=f[i][j]
【代码】
#include<cstdio> #include<cstring> using namespace std; const int N = 16 , M = 55; const int MOD = 1e6+3; int f[M][1<<N],g[M][26]; char s [M]; int T,n,K,len; int main() { scanf("%d",&T); while(T--) { memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); scanf("%d%d",&n,&K); for(int i=0;i<n;i++) scanf("%s",s[i]); len=strlen(s[0]); for(int i=0;i<len;i++) for(int j=0;j<n;j++) { if(s[j][i]!='?') g[i][s[j][i]-'a']^=(1<<j); else for(int k=0;k<26;k++) g[i][k]^=(1<<j); } int all=1<<n; f[0][all-1]=1; for(int i=0;i<len;i++) for(int j=0;j<all;j++) if(f[i][j]) for(int k=0;k<26;k++) f[i+1][j&g[i][k]]=(f[i+1][j&g[i][k]]+f[i][j])%MOD; int ans=0,cnt; for(int j=0;j<all;j++) { cnt=0; for(int i=0;i<n;i++) if(j&(1<<i)) cnt++; if(cnt==K) ans=(ans+f[len][j])%MOD; } printf("%d\n",ans); } return 0; }
相关文章推荐
- 神奇的css属性clip-path
- 20个常用Linux性能监控工具/命令
- TensorFlow 版本问题
- BitmapFactory.Options 解决加载大图片OOM
- Windows进程间通信
- SVN服务器搭建和使用(二)
- TensorFlow 版本问题
- skyeye1.2.6在ubuntu12.04编译安装
- 如何让android studio在运行时自带签名
- 26.时空跳跃者的魔法
- Tomcat双向证书验证
- Linux 下使用Visual Studio Code
- python爬虫抓网页的总结
- 26.时空跳跃者的魔法
- 26.时空跳跃者的魔法
- 26.时空跳跃者的魔法
- 26.时空跳跃者的魔法
- 26.时空跳跃者的魔法
- 南开大学2016年硕士研究生入学考试初试成绩查询结果
- 图片异步加载ImageLoader