唔...懒兔子来写博客了...

点我看题

这题的话...我想了很久但是都不是可行解

刚开始想预处理任意两个串是否可以匹配然后在乱搞,后来发现完全不会写...

然后按照惯例,我会看题解认真的思考...

唔...其实看完题解貌似这题还挺容易的?

我们可以预处理一个数组 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的更多相关文章

  1. [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp

    Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...

  2. [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp

    Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...

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

    Description Input 本题包含多组数据.  第一行:一个整数T,表示数据的个数.  对于每组数据:  第一行:两个整数,N和K(含义如题目表述).  接下来N行:每行一个字符串. T ≤ ...

  4. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  5. Bzoj1879 [Sdoi2009]Bill的挑战

    Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 724  Solved: 363 Description Input 本题包含多组数据. 第一行:一个整数T ...

  6. BZOJ1879 [Sdoi2009]Bill的挑战 【状压dp】

    题目 输入格式 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ 5,M ≤ 15,字符串长 ...

  7. 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP

    [BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据.  第一行:一个整数T,表示数据的个数.  对于每组数据:  第一行:两个整数,N和K(含 ...

  8. 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]

    Bill的挑战 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...

  9. 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)

    [BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...

随机推荐

  1. Python 3.5 中的异步HTTP请求写法

    Python 3.5 增加了对async def and await的支持,同样的异步代码看起来干净了很多,也更易读. import aiohttp import asyncio async def ...

  2. 解决启动Tomcat时遇到INFO: Destroying ProtocolHandler ["ajp-apr-8009"]

    问题描述: 启动Tomcat时,出现INFO: Destroying ProtocolHandler ["ajp-apr-8009"]等信息 这说明端口号被占用了... 解决方法: ...

  3. javafx 表格某一列设置未复选框

    1.表格要设置成可编辑.2.对列进行如下设置.列定义: @FXMLprivate TableColumn<Hole, Boolean> id_colCheck; 列设置id_colChec ...

  4. Apache mahout 源码阅读笔记--DataModel之FileDataModel

    要做推荐,用户行为数据是基础. 用户行为数据有哪些字段呢? mahout的DataModel支持,用户ID,ItemID是必须的,偏好值(用户对当前Item的评分),时间戳 这四个字段 {@code ...

  5. Linux进程虚拟地址空间管理2

    2017-04-12 前篇文章对Linux进程地址空间的布局以及各个部分的功能做了简要介绍,本文主要对各个部分的具体使用做下简要分析,主要涉及三个方面:1.MMAP文件的映射过程 2.用户 内存的动态 ...

  6. C#线程池ThreadPool

    线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: 设置线程数量ThreadPool.SetMaxThreads(initDownCardThreadPool, maxDownCard ...

  7. python logging模块介绍

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

  8. 2、css

    web 前端2 CSS   CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 ...

  9. OS X 10.9 Mavericks下如何安装Command Line Tools(命令行工具)

    OS X 10.9 Mavericks下如何安装Command Line Tools(命令行工具) 今天OS X 10.9 Mavericks正式发布,免费更新,立即去更新看看效果. 不过升级后安装命 ...

  10. 在debian9上安装mongodb

    MongoDB是一个免费的开源NoSQL文档数据库,在现代Web应用程序中常用.在本教程中,您将安装MongoDB,管理其服务,并可选择启用远程访问.要遵循这个...... 介绍 MongoDB是一个 ...