状压DP可以用在NP问题的小规模求解中(不理解,感觉和可以搜索的题很类似)

如果状态是个网格,数据范围很小,基本锁定状压DP

例题是BZOJ1725

题意是这样的,给定一个黑白图,然后种田,要求田与田之间不能挨着

而且只能往黑格子上种田

这个的意思让我联想到了棋盘动规的骑士游历和过河卒

或者是完全背包里的货币系统

扯远了,我把我对代码的理解都写在了注释里面

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int mod=;
  5. const int maxn=;
  6. int m,n,ans;
  7. int mp[maxn],f[maxn][<<maxn];
  8. void dp()
  9. {
  10. //--------->>>>>>>>这么个方向
  11. int ed=(<<n)-; //每一列的状态总数
  12. for(int i=;i<=ed;i++)
  13. {
  14. if((i&(i>>))==&&(i|mp[])==mp[]) //初始化第一列的方案数
  15. //看是否是1010101这样的状态
  16. //然后看这个状态如果和mp的描述相符,就给i安排上
  17. f[][i]=;
  18. }
  19. for(int i=;i<=m;i++)
  20. for(int j=;j<=ed;j++)
  21. if(f[i-][j]) //如果上一个阶段的此种状态有值
  22. for(int k=;k<=ed;k++)
  23. if((j&k)==&&(k|mp[i])==mp[i]&&(k&(k>>))==)
  24. //那么本阶段的一些状态就要被安排上
  25. //首先状态重复的不行
  26. //然后必须得跟地图描述一致
  27. //然后还得是10101这样的
  28. //吐槽一下,状态压缩真滴玄学
  29. f[i][k]=(f[i][k]+f[i-][j])%mod;
  30. //可以愉快地继承了
  31. for(int i=;i<=ed;i++)
  32. ans=(ans+f[m][i])%mod; //把最终迭代的结果加在一起就是最终结果了
  33. }
  34. int main()
  35. {
  36. int x;
  37. scanf("%d%d",&m,&n);
  38. for(int i=;i<=m;i++)
  39. for(int j=;j<=n;j++)
  40. {
  41. scanf("%d",&x);
  42. mp[i]<<=;mp[i]+=x;
  43. //mp直接通过输入的0和1处理成二进制数,骚操作
  44. //mp存的就是每一列的地图情况
  45. }
  46. dp();
  47. printf("%d",ans);
  48. return ;
  49. }

当然这是谁我的理解,水平有限目前仅仅是这个程度,日后还要大量刷dp题才好的

动态规划:状压DP的更多相关文章

  1. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  2. 动态规划---状压dp

    状压dp,就是把动态规划之中的一个个状态用二进制表示,主要运用位运算. 这里有一道例题:蓝书P639猛兽军团1 [SCOI2005]互不侵犯 题目: 题目描述 在N×N的棋盘里面放K个国王,使他们互不 ...

  3. 状态压缩动态规划(状压DP)详解

    0 引子 不要999,也不要888,只要288,只要288,状压DP带回家.你买不了上当,买不了欺骗.它可以当搜索,也可以卡常数,还可以装B,方式多样,随心搭配,自由多变,一定符合你的口味! 在计算机 ...

  4. 动态规划专题(一)——状压DP

    前言 最近,决定好好恶补一下我最不擅长的\(DP\). 动态规划的种类还是很多的,我就从 状压\(DP\) 开始讲起吧. 简介 状压\(DP\)应该是一个比较玄学的东西. 由于它的时间复杂度是指数级的 ...

  5. 动态规划晋级——POJ 3254 Corn Fields【状压DP】

    转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...

  6. HDU5117 Fluorescent 期望 计数 状压dp 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5117.html 题目传送门 - HDU5117 题意 $T$ 组数据. 给你 $n$ 盏灯 ,$m$ 个 ...

  7. [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp

    Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...

  8. [bzoj3717][PA2014]Pakowanie_动态规划_状压dp

    Pakowanie bzoj-3717 PA-2014 题目大意:给你n个物品m个包,物品有体积包有容量,问装下这些物品最少用几个包. 注释:$1\le n\le 24$,$1\le m\le 100 ...

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

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

随机推荐

  1. Android开发——告诉你Adapter应该写在Activity里面还是外面

    0. 前言 本文转载自AItsuki的博客. 首先说明一下为什么要写这么一篇博客:最近看了一些其他人的项目,发现很多项目的做法是建立一个专门存放Adapter类的Package包,也有的项目干脆直接都 ...

  2. C++11中rvalue references的使用

    Rvalue references are a feature of C++ that was added with the C++11 standard. The syntax of an rval ...

  3. ORB-SLAM (四)tracking跟踪解析

    初始化完成后,对于相机获取当前图像mCurrentFrame,通过跟踪匹配上一帧mLastFrame特征点的方式,可以获取一个相机位姿的初始值:为了兼顾计算量和跟踪鲁棒性,处理了三种模型: 1. Tr ...

  4. sed 集合(项目中的笔记)

    奇数行和偶数行合并为一行: Like: Sequence number: 5398Sequence name: Glyma.16G123500.1Sequence number: 5399Sequen ...

  5. PHP 头像上传

    嘻嘻,自从圣诞节过后,就一直懒散,这几天也因为是太过于繁忙的原因,感觉好久都没有出来冒冒泡,诶... 为了生活一直在奋斗,作为一名前端开发工程师,我现在越来越迷茫了,都不知道现在自己到底算什么了? 会 ...

  6. Sleuth+Zipkin+Log

    https://blog.csdn.net/sqzhao/article/details/70568637 https://blog.csdn.net/yejingtao703/article/det ...

  7. 分词(Tokenization) - NLP学习(1)

    自从开始使用Python做深度学习的相关项目时,大部分时候或者说基本都是在研究图像处理与分析方面,但是找工作反而碰到了很多关于自然语言处理(natural language processing: N ...

  8. 链上链下交互 以太坊Dapp接口开发

    主要是指的是用NodeJs调用 提供接口供前端使用 用户查询和转账 以太坊Dapp项目 众筹项目 功能需求 路人 查看所有众筹项目, 2 @ OK 根据众筹项目的address获取该众筹的详情 (参与 ...

  9. flask - 1

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, Worl ...

  10. spark1.6.0伪分布式搭建

    环境: hadoop2.6.0 jdk1.8 ubuntu 14.04 64位 1 安装scala环境 版本是scala-2.10.6,官网下载地址http://www.scala-lang.org/ ...