状压DP 就是状态压缩DP。所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态

比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 11111就是全开 00000就是全关 00001就是只开了第五个 00101就是第三和第五个开了 以此类推.....而这个二进制串是可以用一个十进制数表示的 比如31就是11111 ,1就是00001等等,这样我们在遍历的时候就不用将五个灯泡疯狂循环,只需要从0遍历到31即可 大大节省了时空。

这里需要解释的是,空间的节省是很显然的,本来需要开一个a[5]的数组来存这些灯泡的一种状态,现在只需要一个数了,但是时间复杂度是怎么体现的呢?明明都是2^5种情况呀!似乎并没有节省遍历带来的时间复杂度......这是因为对于二进制的操作要比通过对存储的状态进行模拟简单得多 举个例子来说:假如我们要求这些灯泡相邻的不能同时亮,如果没有用到状压,就是对每种状态进行判断,如果相邻的状态一样就跳出,那么每种状态都需要从1到5扫一遍,这是很麻烦的,但是经过状压之后,这就容易许多了:x&(x<<1) 即可,比之前的方式省时省力!

需要强调的是,状压本身对于dp没有影响,该怎么dp还是怎么dp,但是对于遍历和操作却方便了很多。

下面列出一些二进制的常规操作(江苏省淮阴中学薛志坚整理)

还有求当前二进制串中1的数量 这个是我写这个博客的时候看到的

int sum=;
while(x){
++sum;
x&=x-;
}

例题

P1896 [SCOI2005]互不侵犯

我们采用dp[i][j][s]来表示第i行的状态是j的情况下 前i行放了s个国王的方法总数 很明显,dp[i][j][s]+=dp[i-1][k][s-sum(j)] 其中k代表上一行的状态,sum(j)代表第i行的国王数。

具体来看代码:

#include<bits/stdc++.h>

using namespace std;

long long int sit,i,N,K,j,k,s,n,dp[][<<][],a[<<],anss;

long long int sum(long long int i)  //求状态i的国王数
{
long long int a=;
while(i)
{
if(i&)
a++;
i=i>>;
}
return a;
} int main()
{
cin>>N>>K;
n=<<N;
for(i=;i<n;i++)
{
if(i&(i<<)) //判断左右国王是否冲突
continue;
a[++sit]=i;
dp[][sit][sum(i)]=; //初始化
}
for(i=;i<=N;i++)
{
for(k=;k<=sit;k++) //上一行
{
for(j=;j<=sit;j++) //本行
{
if(a[k]&a[j]) //上下有国王冲突
continue;
if(a[k]&(a[j]<<)) //右上有国王冲突
continue;
if(a[k]&(a[j]>>)) //左上有国王冲突
continue;
for(s=K;s>=sum(a[j])+sum(a[k]);s--) //遍历前i行放置的国王总数 这里我看的其他博客上写的都是 s>=sum(a[j]) 但是我感觉不需要 因为你得满足前一行的状态    
dp[i][j][s]+=dp[i-][k][s-sum(a[j])];
}
}
}
for(i=;i<=sit;i++)
anss+=dp[N][i][K]; //遍历最后一行的状态 输出答案
cout<<anss<<endl;
}

需要注意的是 要用 long long 否则是70分......

状压DP概念 及例题(洛谷 P1896 互不侵犯)的更多相关文章

  1. 状压dp大总结1 [洛谷]

    前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...

  2. 洛谷P1896 互不侵犯

    又是一道状压DP求方案数的题... 多了一个放k个的限制,于是我们把数组多开一维. f[i][j][k]表示前i行放了j个,第i行状态为k的方案数. 然后老套路DFS转移,这次要多记录一个cnt表示上 ...

  3. 洛谷 P1896 互不侵犯King

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

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

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

  5. 状压dp入门

    状压dp的含义 在我们解决动态规划题目的时候,dp数组最重要的一维就是保存状态信息,但是有些题目它的具有dp的特性,并且状态较多,如果直接保存的可能需要三维甚至多维数组,这样在题目允许的内存下势必是开 ...

  6. 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)

    洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...

  7. 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)

    洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...

  8. 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)

    洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...

  9. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

随机推荐

  1. MySQL主从、主主、半同步节点架构的的原理及实验总结

    一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...

  2. 网络下载器 EagleGet v2.0.4.60 Full 绿色便携版

    下载地址:点我 基本介绍 EagleGet(亦称 EG Download Accelerator)是一个用于 Windows 系统的下载管理器,它是免费软件.EagleGet 使用多线程技术,支持从Y ...

  3. 用JavaScript做一個簡單的計算器

    今天繼續學習JavaScript,視頻講的確實挺差勁的.還是只能跟著W3School自己慢慢摸索著弄了.自己百度了一下,參考了一個大佬寫的一個簡單的計算器代碼.代碼能跑通,但是做出來的樣子實在是感覺太 ...

  4. Linux系统-CENTOS7使用笔记

    复制文件夹下的所有文件到另一个文件夹下 cp ~/dirname/* ~/otherdirname 解压rar文件 PS:在liunx下原本是不支持rar文件的,需要安装liunx下的winrar版本 ...

  5. MyBatis 使用枚举或其他对象

    From<Mybatis从入门到精通> 1.笔记: <!-- 6.3 使用枚举或者其他对象 6.3.1 使用MyBatis提供的枚举处理器 不懂: 因为枚举除了本身的字面值外,还可以 ...

  6. CitusDB UPSERT

    CitusDB的upsert功能 postgresql9.5 版本支持 "UPSERT" 特性, 这个特性支持 INSERT 语句定义 ON CONFLICT DO UPDATE/ ...

  7. C# ExcelAddIn 开发笔记

    好久都没有写博客了,最近真的是太忙了,接手公司要做的一个小的新的项目,从接触认识到一个新东西,再到自己琢磨研究,最终结合公司业务把整个excel插件项目完成,还是有一点点成就感.以下是项目中基本上大致 ...

  8. 十九、表添加字段的SQL语句写法

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数增加字段: alter table [表名] add 字段名 smallin ...

  9. NetCore跨平台桌面框架Avalonia的OSX程序打包

    虽然工作开发语言已经转到了java,但平时仍会用netcore做一些小工具,提升工作效率,但是笔记本换成了Mac,小工具只能做成命令行形式,很是痛苦,迫切需要一个.net跨平台的桌面程序解决方案. 为 ...

  10. Shiro权限管理框架(一):Shiro的基本使用

    首发地址:https://www.guitu18.com/post/2019/07/26/43.html 核心概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码 ...