首页 > 其他分享 >状压dp

状压dp

时间:2024-04-16 17:34:21浏览次数:18  
标签:二进制 状压 int 枚举 operatorname dp

简介

状压dp是一种将一堆 \(0\) 和 \(1\) 压缩成一个二进制的dp,具体如下:

\(dp_{0/1,0/1,\dots,0/1}\rightarrow dp_{x}\)

这里的 \(x\) 是一个整数,但我们会把他看作是他的二进制形式。虽然时间复杂度没有变,但写起来更方便。状压dp一般适用于 \(N \le 20\) 的数据范围。

优化

由于某些状压dp十分卡常,所以这里介绍一些技巧:

方法1

如果枚举每一位是只需枚举为 \(1\) 的位,可以这样写:

int lowbit(int x) {
  return x & -x;
}

int x = s;
for(; x; x -= lowbit(x)) {
  int j = __builtin_ffs(x);
  //...
}

其中 lowbit(x) 可以 \(O(1)\) 求 \(x\) 二进制下最低位的 \(1\) 的位权,具体用法我在这篇文章中介绍了,而 __builtin_ffs(x) 是 C++ 自带的 \(O(1)\) 求 \(x\) 二进制下最低位 \(1\) 的位号 \(+1\),这样写就只会枚举到 \(1\) 的位。

方法2

如果你需要求一个数二进制下 \(1\) 的个数,可以用这个:__builtin_popcount(x)。这个也是 C++ 自带的 \(O(1)\) 求解的函数。

方法3

如果你要枚举一个数 \(y\),使得 \(x \operatorname{or} y = x\),则你可以这么枚举:

for(int y = x; y; y = (y - 1) & x) {
  //...
}
//当y=0时...

这样可以保证所有 \(y\) 中二进制下的 \(1\),在 \(x\) 的二进制下同样有,即 \(x \operatorname{or} y = x\)。但这样的话就不能再循环中处理 \(y=0\) 的情况,只能在循环外处理。

方法4

如果你要枚举一个数 \(y\),使得 \(x \operatorname{or} y = y\),则你可以这么枚举:

for(int y = x; y < (1 << n); y = (y + 1) | x) {
  //...
}
//当y=0时...

这样可以保证所有 \(x\) 中二进制下的 \(1\),在 \(y\) 的二进制下同样有,即 \(x \operatorname{or} y = y\)。

标签:二进制,状压,int,枚举,operatorname,dp
From: https://www.cnblogs.com/yaosicheng124/p/18138768

相关文章

  • [dp 小计] 决策单调性优化
    我要急眼了,看了一个破博客写错的浪费我两个小时Task1先讲讲最简单的类型。通常,都是一类类似\(f_i=\min_{j=1}^if_j+w(i,j)\)决策单调,字面意思,就是每次取的点都是右移的。先声明一下,四边形不等式是决策单调性的充分不必要条件。只证明充分条件。令\(w\)满足\(w(a,c)+w......
  • ORPO偏好优化:性能和DPO一样好并且更简单的对齐方法
    现在有许多方法可以使大型语言模型(LLM)与人类偏好保持一致。以人类反馈为基础的强化学习(RLHF)是最早的方法之一,并促成了ChatGPT的诞生,但RLHF的成本非常高。与RLHF相比,DPO、IPO和KTO的成本明显更低,因为它们不需要奖励模型。虽然DPO和IPO的成本较低,但它们仍需训练两个不同的模型。首......
  • dpdk报错/lib64/libibverbs.so.1: version `IBVERBS_1.8' not found (required by /us
    问题出现的原因:启动的程序需要dpdk,因为不是root用户,调用dodk的程序时报错:EAL:Errorcreating'/run/user/0/dpdk':PermissiondeniedEAL:Cannotcreateruntimedirectory一开始解决的方法是在绑定网卡的时候,/usr/local/sbin/bindnet.sh-vb ,绑定的时候给与普通用户使用的......
  • 互不侵犯 (状压)
    [SCOI2005]互不侵犯题目描述在\(N\timesN\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\)个格子。输入格式只有一行,包含两个数\(N,K\)。输出格式所得的方案数样例#1......
  • Pytorch DistributedDataParallel(DDP)教程二:快速入门实践篇
    一、简要回顾DDP在上一篇文章中,简单介绍了Pytorch分布式训练的一些基础原理和基本概念。简要回顾如下:1,DDP采用Ring-All-Reduce架构,其核心思想为:所有的GPU设备安排在一个逻辑环中,每个GPU应该有一个左邻和一个右邻,设备从它的左邻居接收数据,并将数据汇总后发送给右邻。通过N轮迭代......
  • 12、OSPF-LDP联动
    OSPF-LDP联动 定义在存在主备链路的网络中,当主链路故障恢复后,流量会从备份链路切换到主链路。由于IGP的收敛在LDP会话建立之前完成,导致旧的LSP已经删除,新的LSP还没有建立,因此LSP流量中断。目的如图1所示,PE1-P1-P2-P3-PE2为主链路,PE1-P1-P4-P3-PE2为备份链路。主链路发......
  • Pytorch DistributedDataParallel(DDP)教程一:快速入门理论篇
    一、写在前面随着深度学习技术的不断发展,模型的训练成本也越来越高。训练一个高效的通用模型,需要大量的训练数据和算力。在很多非大模型相关的常规任务上,往往也需要使用多卡来进行并行训练。在多卡训练中,最为常用的就是分布式数据并行(DistributedDataParallel,DDP)。但是现有的......
  • [题解](A-G)Atcoder Educational DP Contest(更新中)
    AtcoderEducationalDPContest\(\textbf{A.Frog1}\)对于一块石头\(i(3\lei\leN)\),\(i-1\)和\(i-2\)均能到达。用\(f[i]\)表示跳到第\(i\)个石头用的最小体力消耗:\[f[i]=min(abs(h[i]-h[i-1])+f[i-1],abs(h[i]-h[i-2])+f[i-2])\qquadi\ge3\]时间复杂度\(O(n)\)。......
  • 【二分+容斥】【ST表/单调栈】【划分型DP】
    二分+容斥题目链接https://leetcode.cn/problems/kth-smallest-amount-with-single-denomination-combination/description/题目大意题目思路假设有一个x元硬币思考只有一种面额为3的硬币时,3可以组成不超过x的面额的数量有x/3种!思考有两种面额【3,6】,可以组成不......
  • eBPF xdp和tc区别
     xdptc层次网卡驱动层数据链路层位置进入Linux网络协议栈之前在Linux网络协议栈中方向只有ingress有ingress和egress修改支持修改报文支持修改报文,有skb结构,修改更方便cilium加载eBPF到虚拟网卡tc上来实现流量转发。......