BZOJ1879:[SDOI2009]Bill的挑战(状压DP)
Description

Input
Output
如题
Sample Input
3 3
???r???
???????
???????
3 4
???????
?????a?
???????
3 3
???????
?a??j??
????aa?
3 2
a??????
???????
???????
3 2
???????
???a???
????a??
Sample Output
914852
0
0
871234
67018
Solution
第一眼数据范围:撞鸭状压DP没跑了
而且连压什么都告诉你了,毕竟只有N能压
状态设计很简单:f[i][S]该选第i列了,当前选中的行是集合S
然后我后面就G了……搞了半天又是容斥又是各种判断乱搞只有20……
其实预处理一下就非常好做了。
预处理出g[第i列][j字母]=集合x
表示j字母可以和集合x的第i位匹配(我第一次看的时候有点绕)
然后就枚举当为集合x的时候第i位填j字母然后进行转移就好了
果然我就是R1出题人说的"学数据结构学傻了"
虽然我数据结构仍然辣鸡
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN (40001)
using namespace std;
int f[][MAXN],g[][];
int N,K,T,len,sum;
char s[][]; int main()
{
scanf("%d",&T);
while (T--)
{
memset(f,,sizeof(f));
memset(g,,sizeof(g));
scanf("%d%d",&N,&K);
for (int i=; i<=N; ++i)
scanf("%s",s[i]+);
len=strlen(s[]+); for (int i=; i<=len; ++i)
for (int j=; j<; ++j)
for (int k=; k<=N; ++k)
if (s[k][i]=='?' || s[k][i]==j+'a')
g[i][j]|=(<<k-); sum=(<<N)-;
f[][sum]=;
for (int i=; i<=len; ++i)
for (int j=; j<=sum; ++j)
if (f[i-][j])//不加这个判断会TLE,可能是%太多了?
for (int k=; k<; ++k)
(f[i][j&g[i][k]]+=f[i-][j])%=; int ans=;
for (int i=; i<=sum; ++i)
{
int x=i,cnt=;
while (x)
{
if (x&) cnt++;
x>>=;
}
if (cnt==K) (ans+=f[len][i])%=;
}
printf("%d\n",ans);
}
}
BZOJ1879:[SDOI2009]Bill的挑战(状压DP)的更多相关文章
- 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP
		
[BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含 ...
 - BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP
		
本来打算好好写写SDOI的DP题目,但是忒难了, 太难了,就写的这三道题仿佛是可做的. 生在弱省真是兴奋. 这题目直接状压,f[i][j]表示匹配到i,状态集合为j的方案数,然后递推即可. #incl ...
 - BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)
		
题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ...
 - 【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千题计划207:bzoj1879: [Sdoi2009]Bill的挑战
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...
 - Bzoj1879 [Sdoi2009]Bill的挑战
		
Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 724 Solved: 363 Description Input 本题包含多组数据. 第一行:一个整数T ...
 - BZOJ1879 [Sdoi2009]Bill的挑战  【状压dp】
		
题目 输入格式 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ 5,M ≤ 15,字符串长 ...
 - 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP
		
[BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...
 
随机推荐
- WPF画箭头
			
简介 参考Using WPF to Visualize a Graph with Circular Dependencies的基础上写了一个WPF画箭头的库. 效果图如下: 使用的XAML代码如下: ...
 - PHP5中Static和Const关键字
			
(1) static static要害字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享, ...
 - IntelliJ IDEA+Mysql connecter/j JDBC驱动连接
			
在IntelliJ IDEA中用connecter/j jdbc驱动连接MYSQL 以下是解决过程,待整合...有点懒,有空再改 官方文档:https://www.cnblogs.com/cn-chy ...
 - 一、python简单爬取静态网页
			
一.简单爬虫框架 简单爬虫框架由四个部分组成:URL管理器.网页下载器.网页解析器.调度器,还有应用这一部分,应用主要是NLP配合相关业务. 它的基本逻辑是这样的:给定一个要访问的URL,获取这个ht ...
 - 封装hiredis——C++与redis对接(一)(string的SET与GET操作)
			
在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接.于是查询了一些资料,最后找到了hiredis.然而直接用它的话,难免有点不方便.于是,对其进行封装. hiredis直接去g ...
 - 你必须知道的get与post的真正区别
			
我们会经常看到有人问:http协议中GET请求和POST请求有什么区别~? 这个问题看似很简单,但是不同程度的人会回答出不同的结果.在公司的面试中,也会经常的问及类似这样的问题,看似很简单,但是不同层 ...
 - 图片大于div时的居中显示
			
当图片大于div时,想要图片居中显示,如果图片等比例缩小可能会导致图片不能填充整个div,如果直接将图片不设置宽高,将其外层div设置overflow:hidden:这时即使外层div设置了水平垂直居 ...
 - timestamp to time 时间戳转日期
			
function timestampToTime(timestamp) { var date = new Date(timestamp * 1000); //timestamp 为10位需*100 ...
 - Java 开源博客 Solo 1.4.0 发布 - 简化
			
Solo 1.4.0 正式发布了!这个版本主要是简化了配置项,修复了一些缺陷并改进了很多细节体验,感谢一直以来关注和支持我们的朋友! 只需一个命令即可启动(不需要安装数据库.部署容器):也可以通过 w ...
 - 您需要售后返修管理软件的N个理由
			
一.减少人工成本. 二.提高工作效率. 三.其他管理成本降低. ▲传统采用人工登记或电子表格Excel管理 售后人员,他们日常的工作就是接件.维修.送修.记录.统计.跟件.寄送件.电话客户沟通.电话厂 ...