深感自己姿势水平之蒻……一直都不是很会状压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. JavaScript中必记英语单词及含义

    reflow[ri'flo]:回流,重构(通过css改变页面的结构,比如一行元素,其中一个元素的高改变了,那么其他元素的位置也都会改变) repaint['ripent]:重绘(只改变页面的样式,比如 ...

  2. node——REFL介绍

    看视频笔记 REFL全称:Read-Eval-Loop(交互式解释器) R 读取 -读取用户输入,解析输入了javascript数据结构并存储在内存中 E 执行 -执行输入的数据结构 P 打印 -输出 ...

  3. NYOJ 737 石子合并(一)

    题意 排成一排的石子,每次合并相邻两堆并由一定的代价,求合并成一堆的最小代价 解法 区间dp 枚举长度 dp[i,j]表示合并石子堆编号从i到j为一堆所需的最小代价(这个题目的代价是sum(i..j) ...

  4. sklearn学习9----LDA(discriminat_analysis)

    1.导入模块 http://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscrimi ...

  5. vue通过路由实现页面刷新

    vue 开发微信商城项目,需求如下: 购物车页面跳转到详情页,购物车页面包含了多个组件,点击结算跳转到订单页面,从订单返回时,购物车页面没有刷新,由于购物车组件之间通过bus实现事件传递,页面跳转(非 ...

  6. Vue入门教程(2)

    小白入门学习vue和vue实例,vue总结 这就是我脑海中的 Vue 知识体系: 一句话概况了 Vue 通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件 Vue 的创建 我们的学习目的肯定 ...

  7. js实现点击复制网页内容(基于execCommand)

    通过execCommand方法来实现,当一个HTML文档切换到设计模式 designMode时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容.大多数命令影响文档 ...

  8. Mysql 5.7 官方文档翻译

    始于 2017年4月1日-愚人节 1.1 MySQL 5.7 新功能 本章节介绍了MySQL 5.7 新版本中新增.废弃.删除的功能. 在1.5章节 Section 1.5, "Server ...

  9. map和multimap映射容器

    map容器 map所处理的数据与数据库表具有键值的记录非常相似,在键值与映射数据之间,建立一个数学上的映射关系.map容器的数据结构仍然採用红黑树进行管理.插入的元素键值不同意反复,所使用的结点元素的 ...

  10. IOS假设将一个十六进制的color转换成UIColor,非常有用

    UI给开发的效果图非常多时候标注着十六进制的Color,而程序中用到的往往是UIColor能够用例如以下方法去转换: (UIColor *)RGBColorFromHexString:(NSStrin ...