状压DP之Bill的挑战
题目
P2167 [SDOI2009]Bill的挑战
Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计。在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度的不满。于是他再次挑战你。这次你可不能输!(一个不服输让我这个ruoji码了俩小时)
这次,比赛规则是这样的:
给N个长度相同的字符串(由小写英文字母和‘?’组成),\(S_1,S_2,S_3......S_N\),求与这N个串中的刚好K个串匹配的字符串T的个数(答案模1000003)。
若字符串\(S_x\)(1≤x≤N)和T匹配,满足以下条件:
1.\(S_x.length = T.length\)。
2.对于任意的\(1≤i≤S_x.length\),满足\(S_x[i]='?'\)或者\(s_x[i]=T[i]\)。
其中T只包含小写英文字母。
输入格式
本题包含多组数据。
第一行:一个整数T,表示数据的个数。
对于每组数据:
第一行:两个整数,N和K(含义如题目表述)。
接下来N行:每行一个字符串。
\(T ≤ 5,N ≤ 15\),字符串长度≤ 50。
输出格式
对于每组数据,输出方案数目(共T行)
样例
样例输入
5
3 3
???r???
???????
???????
3 4
???????
?????a?
???????
3 3
???????
?a??j??
????aa?
3 2
a??????
???????
???????
3 2
???????
???a???
????a??
样例输出
914852
0
0
871234
67018
思路
- 这道题是真的难想,一开始我觉得应该从行数开始枚举进行装压DP,但是看到字符串长度最大为\(50\),还是算了(汗),容易爆掉,所以转换思想,枚举位数,维护数组\(g[i][j]\)表示第\(i\)个位数下放\(j\)的情况下该列的匹配情况,预处理好像就这些(汗);
- 接下来就是紧张刺激的DP环节了,我们定义\(f[i][j]\)为\(T\)串已经匹配了\(i\)位,且与\(n\)个字符串是否匹配的集合为\(j\),状态边界为\(lim\),\(f[0][lim-1]=1\),首先枚举位数,然后枚举状态,如果\(f[i][j]==0\)不需要进行操作,可以剪枝,然后枚举字符,在下一状态下添加字符的种类数为本状态加上下一状态的原种类数
- 最后枚举不同状态,记录该状态与原数组的匹配情况,判断该状态是否包括某一行的位数(即该行匹配),如果是则\(tot++\),如果\(tot=m\),叠加\(f[len][当前状态]\),求解\(ans\)。
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=1e6+3;
const int maxn=100010;
int f[50+5][1<<15],g[50+5][30];
char s[16][50+5];
int T,n,m;
int main(){
scanf("%d",&T);
while(T--){
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%s",s[i]);
int len=strlen(s[0]);
for(int i=0;i<len;i++){//枚举位数
for(int j=0;j<26;j++){//枚举字符
for(int k=0;k<n;k++){//枚举行数
if(s[k][i]=='?' || s[k][i]==j+'a')g[i][j]|=(1<<k);//位数为i时j字符的匹配情况
}
}
}
int lim=(1<<n);
f[0][lim-1]=1;
for(int i=0;i<len;i++){//枚举位数
for(int j=0;j<lim;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;
for(int i=0;i<lim;i++){//枚举状态
int tot=0;
for(int j=0;j<n;j++){
if(i & (1<<j))tot++;
}
if(tot==m)ans=(ans+f[len][i])%mod;
}
printf("%d\n",ans);
}
}
状压DP之Bill的挑战的更多相关文章
- 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]
Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...
- [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
- bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...
- BZOJ1879:[SDOI2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ ...
- bzoj 1879: [Sdoi2009]Bill的挑战【状压dp】
石乐志写容斥--其实状压dp就行 设f[i][s]表示前i个字母,匹配状态为s,预处理g[i][j]为第i个字母是j的1~n的集合,转移的时候枚举26个字母转移,最后答案加上正好有k个的方案即可 #i ...
- [学习笔记]状压dp
状压 \(dp\) 1.[SDOI2009]Bill的挑战 \(f[i][j]\) 表示匹配到字符串的第 \(i\) 位状态为 \(j\) 的方案数 那么方程就很明显了,每次枚举第 \(i\) 位的字 ...
- bzoj 1879 状压dp
879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 852 Solved: 435[Submit][Status ...
- 状压DP复习
深感自己姿势水平之蒻……一直都不是很会状压DP,NOIP又特别喜欢考,就来复习一发…… 题目来源 Orz sqzmz T1 [BZOJ4197][NOI2015]寿司晚宴 (做过)质因数分解最大的质因 ...
- 状压DP之LGTB 与序列
题目 思路 这道题竟然是状压DP,本人以为是数论,看都没看就去打下一题的暴力了,哭 \(A_i\)<=30,所以我们只需要考虑1-58个数,再往后选的话还不如选1更优,注意,1是可以重复选取的, ...
随机推荐
- Elasticsearch系列---生产集群部署(下)
概要 本篇继续讲解Elasticsearch集群部署的细节问题 集群重启问题 如果我们的Elasticsearch集群做了一些离线的维护操作时,如扩容磁盘,升级版本等,需要对集群进行启动,节点数较多时 ...
- 调优 | Apache Hudi应用调优指南
通过Spark作业将数据写入Hudi时,Spark应用的调优技巧也适用于此.如果要提高性能或可靠性,请牢记以下几点. 输入并行性:Hudi对输入进行分区默认并发度为1500,以确保每个Spark分区都 ...
- install-package : 由于无法加载项目 mydemo 的详细信息,操作失败
安装nuget package包提示错误 install-package : 由于无法加载项目 mydemo 的详细信息,操作失败 解决方法 项目用dotnet cli 命令dotnet new mv ...
- Linux系统命令详解
目录 1. su 1.1. su命令中passwd的自动输入 2. sshpass 3. locate/mlocate 4. top/htop 5. lftp 6. kill/killall 1. s ...
- pip未找到
命令终端运行 sudo easy_install pip 安装成功后最后会显示 Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7. ...
- Dubbo——服务目录
引言 前面几篇文章分析了Dubbo的核心工作原理,本篇将对之前涉及到但却未细讲的服务目录进行深入分析,在开始之前先结合前面的文章思考下什么是服务目录?它的作用是什么? 正文 概念及作用 清楚Dubbo ...
- 能被 K 整除的最大连续子串长度
[来源]网上流传的2017美团秋招笔试题 [问题描述] 两个测试样例输出都是5 [算法思路] 暴力解法时间会超限,使用一种很巧妙的数学方法.用在读取数组arr时用数组sum记录其前 i 项的和,即 s ...
- 获取系统的IP地址
获取linux主机的IP地址 问题描述 在很多软件配置过程中,都需要设置ID信息,通常我选择使用系统配置的eth0网卡的IP地址信息,比如salt-minion-id,在通过cobbler批量安装操作 ...
- 手把手教你学Numpy,搞定数据处理——收官篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...
- 13.DRF-版本
Django rest framework源码分析(4)----版本 版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db imp ...