bzoj1879: [Sdoi2009]Bill的挑战(codevs2308)(luoguP2167) 状压dp
唔...懒兔子来写博客了...
这题的话...我想了很久但是都不是可行解
刚开始想预处理任意两个串是否可以匹配然后在乱搞,后来发现完全不会写...
然后按照惯例,我会看题解认真的思考...
唔...其实看完题解貌似这题还挺容易的?
我们可以预处理一个数组 g[i,j] 表示 在这 n 个串中前 i 个字符且第 i 个字符匹配为 j (j 是一个字符) 时的一个状态。
这个状态为一个长度为n的 2进制数转为10进制。比如 111 这个状态指 1 串和2 串和 3 串都是可以匹配的。
这个数组就是这个作用。
辣它可以干什么捏。
我萌进入dp部分。
设 f[i,j] 表示 每个串前 i 个字符 状态为 j 的方案数。
初始化就是 f[0,1 << n-1]=1
答案就是 sum(f[n,j]) 这里的 j 状态要满足 二进制1 的个数为 k。
j 这个状态指 n 个串中选了哪些串。
f[i,j & g[i,x]+=f[i-1,j]
枚举一个 x 字符,对于 ‘a’-‘z’ 这些字符都可以是第 i 位的。
然后枚举前继状态 j 辣么 对于要更新的状态就是 j & g[i,x]
为什么是&? 因为如果能转移到的必须要满足 g[i,x] 中能匹配这个串 同时前继状态也要有。
而 & 就是只有两个都是1 的时候才为 1 ,所以 & 后就是可以转移的一个状态。
这样打完之后捏,我兴高采烈的交了上去。TLE!!!
算了一下效率,似乎是卡着的呀QAQ
怀疑兔生的我优化了常数,以为是常数的锅。
结果还是 TLE! TLE!TLE!
然后怀疑兔生的又看了一次题解 开始思考原因
发现题解里加了优化的QAQ 但是并没有说...
所以要加一个优化咯。
这样考虑对于 f[i-1,j]=0 的情况 实际上可以不去转移,这样可以省掉很多时间。
- const HR=;
- var s:string;
- i,j,x:longint;
- g:array[..,..]of longint;
- t,n,k:longint;
- f:array[..,..]of longint;
- num:array[..]of longint;
- len:longint;
- ans:longint;
- function check(x:longint):longint;
- var i,num:longint;
- begin
- num:=;
- for i:= to do
- if ( << (i-))and x> then inc(num);
- exit(num);
- end;
- begin
- read(t);
- for i:= to ( << )- do
- num[i]:=check(i);
- while t> do
- begin
- dec(t);
- ans:=;
- readln(n,k);
- for i:= to n do
- begin
- readln(s);
- if i= then len:=length(s);
- for j:= to len do
- for x:= to do
- if ((ord(s[j])-)=x)or(s[j]='?') then
- g[j,x]:=g[j,x] or ( << (i-));
- end;
- f[,( << n)-]:=;
- for i:= to len do
- begin
- for j:= to ( << n)- do
- if f[i-,j]<> then
- begin
- for x:= to do
- begin
- inc(f[i,(g[i,x] and j)],f[i-,j]);
- if f[i,(g[i,x] and j)]>=HR then
- f[i,(g[i,x] and j)]:=f[i,(g[i,x] and j)] mod HR;
- end;
- f[i-,j]:=;
- end;
- if i=len then
- begin
- for j:= to ( << n)- do
- begin
- if num[j]=k then
- begin
- inc(ans,f[len,j]);
- if ans>=HR then ans:=ans mod HR;
- end;
- f[i,j]:=;
- end;
- end;
- end;
- for i:= to len do
- for x:= to do
- g[i,x]:=;
- writeln(ans);
- end;
- end.
bzoj1879
代码巨丑...懒兔子懒得弄好看点了QAQ
bzoj1879: [Sdoi2009]Bill的挑战(codevs2308)(luoguP2167) 状压dp的更多相关文章
- [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp
Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...
- [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
- BZOJ1879:[SDOI2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ ...
- 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,字符串长 ...
- 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP
[BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含 ...
- 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]
Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...
- 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)
[BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...
随机推荐
- 【MongoDB】从入门到精通mongdb系列学习宝典,想学mongodb小伙伴请进来
最近一段时间在学习MongoDB,在学习过程中总共编写了四十余篇博客.从mongodb软件下载到分片集群的搭建. 从理论讲解到实例练习.现在把所有博客的内容做个简单目录,方便阅读的小伙伴查询. 一. ...
- 七牛云存储--内存put示例(go sdk)
啥都不说了,居然有文档,有git为啥不提供example? 自己看代码,琢磨了一下,原来是要这么用的.这里不得不吐槽一下package的命名,为啥要去io?golang自带系统包名就有io啊,哥哥. ...
- 机房断电导致MySQL同步1594错误
1.错误信息 Last_IO_Error: Got fatal error from master when reading data from binary log: ' at 208645951. ...
- Python中字符串拼接的N种方法
python拼接字符串一般有以下几种方法: ①直接通过(+)操作符拼接 s = 'Hello'+' '+'World'+'!'print(s) 输出结果:Hello World! 使用这种方式进行字符 ...
- 为你的CSDN博客添加CNZZ流量统计功能
一.流量统计介绍 流量统计是指通过各种科学的方式,准确的纪录来访某一页面的访问者的流量信息,目前而言,必须具备可以统计. 1.简介 统计独立的访问者数量(独立用户.独立访客): 可以统计独立的IP地址 ...
- 设计模式中类的关系UML
在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖.关联.聚合.组合.继承.实现.他们的耦合度依次增强. 1. 依赖(Dependence) 依赖关系的定义为:对于两 ...
- Android ListView工作原理完全解析(转自 郭霖老师博客)
原文地址:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是ListVie ...
- Python 调用 Shell脚本的方法
Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...
- MySQL8.0新特性
一.修改密码修改root密码之前要先flush privileges;ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'f ...
- php使用amqplib方式使用rabbitmq
安装 sudo apt-get install php sudo apt-get install rabbitmq-server sudo apt-get install php-bcmath php ...