首页 > 其他分享 >【转载】状压dp入门指引 by 高中时期的我自己

【转载】状压dp入门指引 by 高中时期的我自己

时间:2022-12-10 23:56:11浏览次数:65  
标签:状态 题目 入门 int 状压 long dp DP

原文链接

目录

-1.前言

这几天学习了一下状压DP(毕竟CSP初赛就是状压挂掉了),现在也是时候总结一下学习成果,庆祝自己大概学会了状压DP?(雾;

0.概述

这次蒟蒻Xx_queue要和大家一起来学习DP中的很重要的一类:状压DP(状态压缩动态规划);

状压DP,是用二进制来描述状态的一种DP,适用于数据范围比较小的情形,状压DP就是状压+DP;

举个例子:关灯问题:


题目:

现有n盏灯,以及m个按钮。每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果。按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管;如果为-1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是0,无论这灯是否开,都不管。

现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。


先不管题目说的啥,我们就只考虑怎么状压,也就是怎么用二进制来表示状态:

假设n=5,第1,4,5盏灯亮,第2,3盏灯灭,我们就可以考虑利用一个二进制串:11001来表示这个状态:

5 4 3 2 1
状态 1 1 0 0 1
(0表示灭,1表示亮)

是不是很清晰?

所以这个二进制串:11001

就可以表示这5盏灯目前的状态;(题目后面会讲到)

1.位运算(建议初学者认真研究,这是基础)

相信考过CSP的大家都会

几种位运算的方法如下所示(制表不易):

名称 符号 运算法则 举例
按位与 a & b 相同为1,不同为0 00101&11100=00100
按位或 a | b 有1为1,无1为0 00101|11100=11101
按位异或 a ^ b 相同为0,不同为1 00101^11100=11001
按位取反 ~a 是1为0,是0为1 ~00101=11010
左移 a << b 把对应的二进制数左移b位 00101<<2=0010100
右移 a >> b 把对应的二进制数右移b位 00101>>1=0010

大概就这样吧......(或者你可以百度百科一下)

2.常用的计算方法:(建议认真食用,灵活运用)

状压DP要求掌握一定的二进制计算方法,所以大家一定要运用熟练(主要还是要多做题)

建议一边看一边手玩一下,举几个例子更便于理解

重点:用二进制表示的集合的基本运算(有待补充)

运算 计算方法
集合相交 x=a&b
集合相并 x=a|b
枚举子集 for(int x=sta;x;x=((x-1)&sta))

其他运算

可以看看这个图片(来自网络):

也可以看看这些密密麻麻的文字(我是真不想看)(来自网络):


取出x的第i位:\(y=(x>>(i-1))\&1\);

将x第i位取反:$x $ ^ $ = 1<<(i-1)$;

将x第i位变为1:\(x|= 1<<(i-1)\);

将x第i位变为0:\(x\&= ~(1<<(i-1))\);

将x最靠右的1变成0:\(x= x\&(x-1)\);

取出x最靠右的1:\(y=x\&(-x)\);(lowbit函数)

把最靠右的0变成1:\(x|=x+1\)

判断是否有两个连续的1:\(if(x\&(x<<1))\) \(cout<<"YES";\)

判断是否有

标签:状态,题目,入门,int,状压,long,dp,DP
From: https://www.cnblogs.com/truman2022/p/16972649.html

相关文章

  • .NET 6 的轻量级 Webapi 框架 FastEndpoints
    Github: https://github.com/FastEndpointsFastEndpoints(fast-endpoints.com)基于.NET6的轻量级Webapi框架FastEndpoints 大家好,我是等天黑。FastEndpoin......
  • 《MySQL必知必会》之快速入门存储过程
    使用存储过程本章介绍什么是存储过程,为什么使用、如何使用,并介绍如何创建和使用存储过程的基本语法存储过程在实际应用中,往往需要执行多个表的多条sql语句存储过程就......
  • Gin框架快速入门
    github地址:https://github.com/gin-gonic/gin初体验安装:$goget-ugithub.com/gin-gonic/gin简单实例:packagemainimport"github.com/gin-gonic/gin"func......
  • appium环境搭建(从入门到放弃)
    一.appium环境搭建1.python3python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java....2.jdk1)下载地址官网(需登录账号):https://www.oracle.c......
  • 树形DP之点覆盖问题
    什么是点覆盖问题?就是在树上选几个点,覆盖(一个点可以覆盖其相连的边或与其距离不超过\(d\)的点,根据题意具体分析)一些点或边,求最小代价。例题战略游戏题意一棵无根树,......
  • oracle使用dblink impdp数据时报错ORA-39169
    问题描述:oracle使用dblinkimpdp数据时报错ORA-39169,如下所示:源端:oracle10.2.0.464位+oel5.1164位目标端:oracle19.1664位+centos7.964位1、异常重现[oracle@l......
  • ADB命令快速入门
    什么是ADBadb的全称为AndroidDebugBridge,就是起到调试桥的作用。通过adb我们可以方便调试Android程序。环境搭建1需要java环境:安装完JDK需要配置环境变量:......
  • Scrapy入门使用
    1.scrapy入门使用学习目标:掌握scrapy的安装应用创建scrapy的项目应用创建scrapy爬虫应用运行scrapy爬虫应用scrapy定位以及提取数据或属性值的方法掌握respo......
  • Entity Framework Core 笔记 - 入门
    先决条件请确保安装了.NETCore第6或7版本,我这安装的是7.   一.领域建模方式1.CodeFirstPOCO:PlainOldCLRObject。内在含义是指那些没有从任何类继承......
  • Linux零基础入门篇
    1.1为什么要学习Linux我们为什么要学习Linux?我们现在的处境是什么?我们想达到什么样的目标?在谈到这三个问题,相信我们每个人都有自己的答案,我们来自不同的家庭,各种经历都不......