[bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009
题目大意:

注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$。
想法:
又是一个看数据范围想做法的题,我们想到状压dp。
看了题解... ...网上给的状态是f[len][s]表示长度为len满足状态s的字符串个数。
光看状态... ...可能算重啊?!
其实... ...
状态:dp[len][s]表示长度为len,能且只能满足状态为s的字符串个数。
转移:我们先预处理出g[i][c]表示第i位能放字符c的字符串状态,转移就是dp[len][s^g[len][c]]+=dp[len-1][s]表示在dp[len-1][s]的所有方案中所有的字符串后面加上c能满足的字符串。这样仍然满足“能且只能”的条件。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1000003
using namespace std;
int f[55][1<<16],ans,len,g[55][27],t,cases,n,k;
char s[20][100];
int main()
{
scanf("%d",&cases);
while (cases--)
{
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
scanf("%d%d",&n,&k); ans=0;
for (int i=1;i<=n;i++) scanf("%s",s[i]);
f[0][(1<<n)-1]=1;
len=strlen(s[1]);
for(int i=1;i<=len;i++) for(int j=0;j<26;j++)
for(int k=1;k<=n;k++)
{
if (s[k][i-1]=='a'+j||s[k][i-1]=='?') g[i][j]|=1<<(k-1);
}
for(int i=1;i<=len;i++) for(int j=0;j<(1<<n);j++)
{
if(!f[i-1][j]) continue;
for(int k=0;k<26;k++) (f[i][g[i][k]&j]+=f[i-1][j])%=mod;
}
for(int i=0;i<(1<<n);i++)
{
int t(0),x=i;
while(x)
{
if(x%2) t++;
x/=2;
}
if(t==k)(ans+=f[len][i])%=mod;
}
printf("%d\n",ans);
}
return 0;
}
小结:看数据范围想做法其实很实用,比如说我们拿到一道题,如果这个数据范围是卡这正解的数据范围出的话,我们就会往一些比较常见的复杂度上想,加快了解题速度。
[bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp的更多相关文章
- 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)
[BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...
- bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战
http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...
- bzoj1879: [Sdoi2009]Bill的挑战(codevs2308)(luoguP2167) 状压dp
唔...懒兔子来写博客了... 点我看题 这题的话...我想了很久但是都不是可行解 刚开始想预处理任意两个串是否可以匹配然后在乱搞,后来发现完全不会写... 然后按照惯例,我会看题解认真的思考... ...
- BZOJ1879:[SDOI2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ ...
- 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,字符串长 ...
- 动态规划:状压DP
状压DP可以用在NP问题的小规模求解中(不理解,感觉和可以搜索的题很类似) 如果状态是个网格,数据范围很小,基本锁定状压DP 例题是BZOJ1725 题意是这样的,给定一个黑白图,然后种田,要求田与田 ...
- 最优配对问题(集合上的动态规划) —— 状压DP
题目来源:紫书P284 题意: 给出n个点的空间坐标(n为偶数, n<=20), 把他们配成n/2对, 问:怎样配对才能使点对的距离和最小? 题解: 设dp[s]为:状态为s(s代表着某个子集) ...
- bzoj 1879: [Sdoi2009]Bill的挑战
题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...
随机推荐
- P3399 丝绸之路(线性二维dp)
P3399 丝绸之路 题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚. ...
- [Swift通天遁地]九、拔剑吧-(17)创建一个三维折叠样式的页面展开效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 在vue项目npm run build后,index.html中引入css和js 报MIME type问题
问题: 1.在vue项目中,build打包后,index页面打开会报错, MIME type ('text/html') ;报错内容:because its MIME type ('text/html ...
- zb的生日-------搜索 和 动态规划
简单的贪心算法 : http://love-oriented.com/pack/P01.html 说实话 我是喜欢 动态规划的.......但是省赛迫在眉睫 , 只好先 学 搜索了 , 赶紧 ...
- Android Framework 学习
1. 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework面存一些资料待有空查看. 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony ...
- 321 Create Maximum Number 拼接最大数
已知长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,直观地表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中 ...
- Unity Toast插件(UGUI版)
简介 介于自己之前经历的一些开发过程,非常希望unity能有类似Toast的功能用于一些简单的信息显示.但是找来找去找了半天,都木有发现,实在是憋不住了,自己写了个,感觉还可以用,发出来共享一下... ...
- CSS——background
背景经常用到以下属性: background-color: aliceblue; background-image: url('2017102601.png'); background-positio ...
- SQL基本操作——函数
函数的类型:在 SQL 中,基本的函数类型和种类有若干种.函数的基本类型是:Aggregate 函数.Scalar 函数. Aggregate 函数:操作面向一系列的值,并返回一个单一的值,下面是SQ ...
- HDU_1285_拓扑排序(优先队列)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...