深感自己姿势水平之蒻……一直都不是很会状压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. [实验楼]python11期--NO.1(未完成)

    tuple 是 Python 的一种不可变数据类型,用于列表数据一旦初始化就不会再修改的场景.tuple 只能通过位置索引去访问里面的元素,但有时候我们需要给每个元素取个别名,以便通过别名去获取对应的 ...

  2. Pyhton学习——Day54

    #Django内容回顾# -请求响应HTTP协议(有.无状态)默认传递的是字符串# 传递字符串分为两个部分:1.http1.1 GET /url /index + 请求头# Provisional h ...

  3. Java 面向对象详解

    0 引言 接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学过的基础知识的想法. 1 面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设 ...

  4. css——导航栏

    导航栏一般用无序列表制作 但出来的导航栏有黑点,还有一些边距 去除黑点我们可以用:list-style-type: none;/*去掉ul前面的点*/ 因为有些标签之间会有默认的边距,所以可以先将边踞 ...

  5. NodeJS加密算法(转)

    nodejs中常用加密算法   1.Hash算法加密: 创建一个nodejs文件hash.js,输入内容如下: 1 var crypto = require('crypto'); //加载crypto ...

  6. 发个ZKW线段树板子测试一下代码高亮

    是我,Long time no see          --Jim 先安利 Wolves  歌手:Madilyn Bailey http://music.163.com/song/524149464 ...

  7. ELK搭建和部署-----(上半部分)

    本实验基于centos7安装部署操作步骤如下: 1.首先准备两台centos7系统,IP地址自行定义. 2.先在服务器上安装时间同步中间件为chronyc 3.并启动命令为systemctl star ...

  8. a标签设置高度不生效问题

    <a>是内联元素 必须设置成块级元素block 才能有width和height 不过你可以又定义display:block再定义成display:inline 以避免在IE6下产生BUG ...

  9. 题解 CF821D 【Okabe and City】

    其实,这道题不用long long也能AC. 题意是给你一个矩阵,有一些格子被点亮有一些没有,每一次只能在被点亮的格子上面走. 然后你每一次都可以选择点亮一行或一排(非永久),现在问你最少点多少次可以 ...

  10. java数组简单逻辑代码

    package cuteSnow; public class HelloWorld { // 遍历数组里面的每个数字 public static void print(int[] array){ St ...