深感自己姿势水平之蒻……一直都不是很会状压DP,NOIP又特别喜欢考,就来复习一发……

题目来源 Orz sqzmz

T1 【BZOJ4197】【NOI2015】寿司晚宴

(做过)质因数分解最大的质因子独自处理,$\sqrt{500}$以内的质数只有八个,因此可以用$2^{16}$的状态来表示一种方案;

然后有同样因子的两个数不能同时出现,排序然后随便搞搞就行了……

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int p[]={,,,,,,,};
struct num{
int n,bigp;
}a[];
bool cmp(num a,num b){
return a.bigp<b.bigp;
}
int n,r=;
ll mod,ans,f[][],g[][][];
int main(){
scanf("%d%lld",&n,&mod);
for(int i=;i<=n;i++){
int tmp=i;
for(int j=;j<;j++){
if(!(tmp%p[j])){
a[i].n|=(<<j);
while(!(tmp%p[j]))tmp/=p[j];
}
}
a[i].bigp=tmp;
}
sort(a+,a+n+,cmp);
f[][]=;
for(int i=;i<=n;i++){
if(i==||a[i].bigp!=a[i-].bigp||a[i].bigp==){
memcpy(g[],f,sizeof(g[]));
memcpy(g[],f,sizeof(g[]));
}
for(int j=r-;~j;j--){
for(int k=r-;~k;k--){
if((j&k)>)continue;
if(!(a[i].n&k))g[][a[i].n|j][k]=(g[][a[i].n|j][k]+g[][j][k])%mod;
if(!(a[i].n&j))g[][j][a[i].n|k]=(g[][j][a[i].n|k]+g[][j][k])%mod;
}
}
if(i==n||a[i].bigp!=a[i+].bigp||a[i].bigp==){
for(int j=r-;~j;j--){
for(int k=r-;~k;k--){
if((j&k)>)continue;
f[j][k]=g[][j][k]+g[][j][k]-f[j][k];
}
}
}
}
for(int j=r-;~j;j--){
for(int k=r-;~k;k--){
if((j&k)>)continue;
ans=(ans+f[j][k])%mod;
}
}
ans=(ans+mod)%mod;
printf("%lld",ans);
return ;
}

T2 【BZOJ1879】【SDOI2009】Bill的挑战

设$f[i][s]$表示到第$i$位,匹配状态为$s$的方案数(S为十五位二进制数),预处理转移状态DP即可。

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define mod 1000003
using namespace std;
typedef long long ll;
int t,n,k,len,ans,bt[],p[][],f[][];
char s[][];
int main(){
for(int i=;i<;i++)bt[i]=bt[i>>]+(i&);
scanf("%d",&t);
while(t--){
memset(f,,sizeof(f));
memset(p,,sizeof(p));
ans=;
scanf("%d%d",&n,&k);
for(int i=;i<n;i++){
scanf("%s",s[i]);
}
len=strlen(s[]);
for(int i=;i<n;i++){
for(int j=;j<len;j++){
if(s[i][j]=='?'){
for(int c=;c<;c++)p[j][c]|=(<<i);
}else p[j][s[i][j]-'a']|=(<<i);
}
}
f[][(<<n)-]=;
for(int i=;i<len;i++){
for(int j=;j<(<<n);j++){
if(f[i][j]){
for(int c=;c<;c++){
f[i+][j&p[i][c]]=(f[i+][j&p[i][c]]+f[i][j])%mod;
}
}
}
}
for(int i=;i<(<<n);i++){
if(bt[i]==k)ans=(ans+f[len][i])%mod;
}
printf("%d\n",ans);
}
return ;
}

状压DP复习的更多相关文章

  1. 状压DP复习笔记

    前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...

  2. 状压dp专题复习

    状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...

  3. 算法复习——状压dp

    状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...

  4. P1879 [USACO06NOV]玉米田Corn Fields 状压dp/插头dp

    正解:状压dp/插头dp 解题报告: 链接! ……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时…… 然后这题还是做过的……就很气,觉得确实是要搞 ...

  5. ZOJ 3777 - Problem Arrangement - [状压DP][第11届浙江省赛B题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 Time Limit: 2 Seconds      Me ...

  6. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

  7. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  8. 【模拟8.11】星空(差分转化,状压DP,最短路)

    一道很好的题,综合很多知识点. 首先复习差分:      将原来的每个点a[i]转化为b[i]=a[i]^a[i+1],(如果是求和形式就是b[i]=a[i+1]-a[i]) 我们发现这样的方便在于我 ...

  9. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

随机推荐

  1. oracle错误ORA-00604 递归sql级别1出现错误 ora-00942 表或试图不存在 ORA-06512 在line 11

    错误截图如下: 搜索了很多方法,但是都没有办法解决,不过最终还是找到了一个好的解决办法, 多谢那位仁兄的博客[http://blog.itpub.net/519536/viewspace-689469 ...

  2. C++内存分配方式——小结

    1 内存分配方式 内存分配方式有如下三种: 从静态存储区域分配.内存在程序编译的时候就分配好了,这些内存在整个程序运行期间都存在,如全局变量.static变量等等. 在堆栈上分配.在函数执行期间,函数 ...

  3. CorelDRAW X6冰点价加推800套燃爆6月

    CorelDRAW是迄今最具创意的图形设计程序,并获得所有行业的公认的知名工具.在刚刚结束的CorelDRAW X6限量活动之后,CorelDRAW官方继续加推800套CorelDRAW X6满足用户 ...

  4. 第十二章 Python网络编程

    socket编程 socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket ...

  5. jsp+jdbc实现用户登录

    1.1 创建数据库表 表名:user 字段: userid   保存用户的登录id name     用户名 password 密码 1.2 实现思路 a. 用户登录,则需要有个一个表单页,此页面可输 ...

  6. 粘包_Server

    from socket import *# import subprocessip_port = ('127.0.0.1',8080)back_log = 5buffer_size = 1024tcp ...

  7. js异步队列之理解

    起因 最近看到一篇关于js异步执行顺序的解答,觉得有所收获,遂记录下来. marcotask和microtask js中异步队列可以分为两类,marcotask队列和microtask队列, marc ...

  8. fflush()函数总结

    1. 概述 函数名: fflush() 功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时 头文件: stdio.h 原型: int fflush(FILE *stream),其中st ...

  9. 《你又怎么了我错了行了吧》【Beta】Scrum Meeting 2

    第二天 日期:2019/6/25 前言: 第2次会议在女生宿舍召开 确认编码阶段已经完成,继续测试项目 1.1 今日完成任务情况以及明日任务安排 姓名 当前阶段任务 下一阶段任务 刘 佳 完善了未开发 ...

  10. async、await 优缺点

    async.await 优缺点 async 和 await 相比直接使用 Promise 来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码.缺点在于滥用 await 可能会导致性能问题 ...