一:状压dp的基本特征

状态压缩问题一般是指用十进制的数来表示二进制下的状态

这种用一个数来表示一组数,以降低表示状态所需的维数的解题手段,就叫做状态压缩。

常用到位运算

二:位运算

&:与运算,相同为1不同为0

| :或运算,全0位0,否则为1

^:异或运算,不同为1,相同为0(也叫半加与运算)

<<:左移操作,x<<j,x在二进制下向左移j位,(也就是原来的数乘j即:x*=j)右边用0填充,反码不同,要用1填充(负数)

>>:右移操作,x>>j相当于x=/j,左边反码,补码补1(负数)

例:

1.判断一个数字x在二进制下的第i位是不是为1if(((1<<(i-1))&x)>0)

将1左移i-1位,相当于制造了一个只有第i位为1其他位都是0的二进制数,然后用该数与x做与运算

2.把一个数字x在二进制下的第x为更改为1

x|=(1<<(i-1))

eg:

有一个n*m的棋盘(1<=n<=5,1<=m<=1000)现有1*2和2*1的小木块无数

要想盖满整个棋盘有多少种方法,答案大于1000000007,mod1000000007。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int N, M;    //n,m分别代表棋盘的长宽
][];    //dp[i][j]表示对于前i-1行,第i行采用第j(一个十进制的数)种状态时,得到的方案可行的总数  
void dfs(int i,int j,int state,int nex)    //这里i代表列数,j代表当前位数(也可以说是行数-1,初始时为0),state代表状态数,nex代表下一列出现的状态
{
    if (j==N)    //用if判断每种情况都尝试去做,而不用if...else判断
    {
        dp[i+][nex]+=dp[i][state];
        return;
    }
    <<j)&state)>)
        dfs(i,j+,state,nex);    //如果这个位置已经被上一列所占用,直接跳过
    <<j)&state)==)
        dfs(i,j+,state,nex|(<<j));       //如果这个位置是空的,尝试放一个左右覆盖1*2的木板
    <N && ((<<j)&state)== && ((<<(j+))&state)==)
        dfs(i,j+,state,nex);     //如果这个位置以及下一个位置都是空的,尝试放一个上下覆盖2*1的木板,而此时要跳过下一个木块
    return;
}
int main()
{
    while (cin>>N>>M)
    {
        memset(dp,,sizeof(dp));
        dp[][]=;    //初始化第一列状态为0的方法数等于1
        ;i<=M;i++)    //外层for循环遍历每一列
        {
            ;j<(<<N);j++)    //内层for遍历每一个列的所有状态
                if (dp[i][j])    //只要dp[i][j]方法数不为空,就执行dfs方法
                {
                    dfs(i,,j,);
                }
        }
        cout<<dp[M+][]<<endl;    //最后dp[m+1][0]就是结果
    }
}

https://blog.csdn.net/harrypoirot/article/details/23163485

一个大佬讲的状压dp

二:状压dp的更多相关文章

  1. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  2. kuangbin专题十二 HDU1074 Doing Homework (状压dp)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  3. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  4. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  5. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

  6. 【状压DP】bzoj1087 互不侵犯king

    一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...

  7. 2014 Super Training #1 B Fix 状压DP

    原题: HDU 3362 http://acm.hdu.edu.cn/showproblem.php?pid=3362 开始准备贪心搞,结果发现太难了,一直都没做出来.后来才知道要用状压DP. 题意: ...

  8. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  9. HDU5731 Solid Dominoes Tilings 状压dp+状压容斥

    题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...

随机推荐

  1. [one day one question] safari缓存太厉害

    问题描述: safari缓存太厉害,这怎么破? 解决方案: window.onpageshow = function(event) { if (event.persisted) { window.lo ...

  2. bzoj1622 / P2908 [USACO08OPEN]文字的力量Word Power

    P2908 [USACO08OPEN]文字的力量Word Power 第一眼:AC自动机(大雾) 直接暴力枚举即可. 用<cctype>的函数较方便(还挺快) $isalpha(a)$:$ ...

  3. Windows共享文件

    通常局域网中处于同一工作组或同一域的计算机只要右键设置文件夹共享即可,但跨工作组或跨域的共享就需要设置一番了. 一.启用共享 二.关闭共享密码保护 这是英文版系统示例,中文版一样,就是在第一步向下拉一 ...

  4. eclipse中下载maven插件解决办法

    https://blog.csdn.net/qq_30546099/article/details/71195446 解决Eclipse Maven插件的最佳方案 https://www.cnblog ...

  5. Validate Binary Search Tree,判断是否是二叉排序树

    算法分析:两种方法,一种是中序遍历,然后得到一个序列,看序列是否是有序的.第二种,是用递归. 中序遍历: public class Solution { List<Integer> lis ...

  6. 网络TCP建立连接为什么需要三次握手而结束要四次

    忽然顿悟了,不管三次握手,还是四次握手,这是保证信息来回两个链路可达(也就是信息能从A到B,也能从B到A)的最低要求.-2018-9-17-晚上九点 举个打电话的例子: A : 你好我是A,你听得到我 ...

  7. 一个故意消耗内存的java程序MemoryEater

    公司提供的测试服务器是vmware的,号称给我6G, 物理内存事实上是按需分配的. 等到真正拿到6G物理内存,黄花菜都凉了. 看到下面的文章,觉得故意用java程序侵占6G内存, 然后把侵占到内存的释 ...

  8. hdu 6386 Age of Moyu (重边判断)

    本来用一个map判重边结果T了, 实际上可以直接给边上打标记即可 int n, m; struct _ {int to,w,vis;}; vector<_> g[N]; int dis[N ...

  9. Java队列的两种实现方式

    1. 基于数组 package Algorithm.learn; import java.util.Arrays; /** * Created by liujinhong on 2017/3/7. * ...

  10. 矩阵快速幂——POJ3070

    矩阵快速幂和普通的快速幂差不多,只不过写起来比较麻烦一点,需要重载*运算符. 模板: struct mat { int m[maxn][maxn]; }unit; mat operator * (ma ...