深感自己姿势水平之蒻……一直都不是很会状压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. Codeforces Round #468 (Div. 2 )D. Peculiar apple-tree_BFS

    题目简单,不多解释. Code: #include<cstdio> #include<queue> using namespace std; const int maxn = ...

  2. 路飞学城Python-Day37(practise)

    #1.自行创建测试数据 create database homework; use homework; # 年级表->老师表->课程表->班级表->学生表->成绩表-&g ...

  3. Link Cut Tree 动态树 小结

    动态树有些类似 树链剖分+并查集 的思想,是用splay维护的 lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链 动态树的操作核心是把你要把 修改/询问/... 等 ...

  4. -java转json hibernate懒加载造成的无限递归问题

    1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...

  5. python_函数传递列表

    '''#创建一个空列表,包含一些要打印的设计unprinted_designs = ['iphone','robot','books']completed_modles = [] #模拟打印每个设计, ...

  6. 洛谷10月月赛II

    #A: P4924 [1007]魔法少女小Scarlet 这道题考了矩阵旋转 其实很考验推公式的能力和代码能力 这里有个小技巧 可以设(x, y)为原点,然后去推公式,然后实际操作中横坐标加上x,纵坐 ...

  7. mybatis插入操作时,返回自增主键id

    mapper.xml 代码 <insert id="insert" parameterType="com.Student" > <select ...

  8. Maven多模块项目搭建

    最近一直在思考如何能够更好的重用代码.减少重复劳动,之前有一篇文章通过导入JAR包的形式,可以重用部分形如util类的方法,但是这样的话,管理起来jar包,特别是协同工作,多项目情况下,管理JAR会出 ...

  9. Ruby print

    Ruby print

  10. WinCE C#程序,控制启动时仅仅能启动一个程序,使用相互排斥量来实现,该实现方法測试通过

    </pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_46349 ...