状压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

留给自己的任务:愤怒的小鸟

posted @ 2024-02-29 08:16  wuhupai  阅读(14)  评论(0)    收藏  举报