状压dp学习笔记
先放上三道例题:
洛谷P2622 关灯问题II
[SCOI2005]互不侵犯
POJ 2411 Mondriaan's Dream
从上面三道可以看出,状压dp适用于数据范围比较小的,并且有浓厚dp色彩(第一题除外,感觉就是纯粹的状压),比如求方案数。状压的转移一般比较好设计,然后转依旧是暴力转移,一般有优化的可以优化,这样可以快一点。方程一般有一维是一个十进制数代表二进制数,这个二进制数一般存的是状态(这个灯开/关,这个位置有/没有国王,这个位置的砖块是横/竖)
然后可以总结出一些设计方程的套路。先看数据范围,找每个格子是否只有两种状态(思路打开),但后暴力判定是否匹配转移。
状压的优化除了一些普通的dp优化,还有就是提前筛出一部分在一个十进制数里就有约束的数,比如
for(int i=0;i<(1<<n);i++){
bool flag=false;
for(int j=0;j<n;j++){
if(j>0){
if(((i>>j)&1)&&((i>>(j-1))&1)){
flag=true;
break;
}
}if(j<n-1){
if(((i>>j)&1)&&((i>>(j+1))&1)){
flag=true;
break;
}
}
}
if(flag==false) v.push_back(i);
}
这里就筛出了一些数,可以快一点qwq
留给自己的任务:愤怒的小鸟