当前位置: 首页 > backend >正文

位运算,状态压缩dp(算法竞赛进阶指南学习笔记)

目录

    • 移位运算
        • 一些位运算的操作
          • 最短 Hamilton 路径(状态压缩dp模板,位运算)

0x是十六进制常数的开头;本身是声明进制,后面是对应具体的数;

数组初始化最大值时用0x3f赋值;

移位运算

左移

把二进制下的数左移低位以0填充

1<<n=2n n<<1=2n

算数右移

把二进制下的数右移 高位以符号位填充,低位舍弃

相当于除以二向下取整:(-3)>>1=-2,3>>1=2;

与/2不同的点在于/2时是向0取整 (-3)/2=-1;

优先级

+,- > <<,>> > <,>,==,!= > &(位与) > ^(异或) > |(位或)

不确定就加括号!

一些位运算的操作

以N=84,a=5,b=3为例;

换为二进制表示为N=0101 0100,a=0101,b=0011

~(按位非):将二进制数的每一位都取反

​ ~N=1010 1011 ~a=1010 ~b=1100

&(按位与):比较两个二进制数的每一位;同时为1时记录为1

​ a&b=0001

​ ((~N)+1)&N=0000 0100

|(按位或):比较两个二进制数的每一位;只要有1就记录为1,同时为0才是0

​ a|b=0111

​ N|(~N)=1111 1111

^(异 或):比较两个二进制数的每一位;相同记为0,不同记为1

​ N^(~N)=1111 1111

​ a^b=0110

最短 Hamilton 路径(状态压缩dp模板,位运算)

题目原文

P10447 最短 Hamilton 路径 - 洛谷

一张 n 个点的带权无向图,求起点 0 至终点 n−1 的最短 Hamilton 路径(从 0∼n−1 不重复地经过每个点一次)。

思路分析

如果暴力去遍历的话时间复杂度是O(n*n!)显然会超时;所以这里就可以利用位运算;用二进制的每一位来代表是否选取过这个点;

这样枚举的次数就降到了2n;就可以通过这道题了;
初始时建立a数组存储点i和点j之间的距离;
再利用f数组进行状态转移的模拟;最后求得的f[(1<<n)-1][n-1]即为最小距离;

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=21;
int a[N][N];
int f[1<<N][N];
signed main(){int n;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>a[i][j];memset(f,0x3f,sizeof f);f[1][0]=0;for(int i=1;i<1<<n;i++){ // 枚举所有情况for(int j=0;j<n;j++){ // 遍历每个点if(i>>j&1) //可以到达for(int k=0;k<n;k++){ // 找下一步准备去的点if((i^(1<<j))>>k&1) //(i^(1<<j)是为了把j的哪一位先去掉,避免jk重复f[i][j]=min(f[i][j],f[i^(1<<j)][k]+a[j][k]);}}}cout<<f[(1<<n)-1][n-1];
}

http://www.xdnf.cn/news/755.html

相关文章:

  • Web前端:常用的布局属性
  • 聊一聊接口测试后垃圾数据如何清理?
  • 【Sa-Token】学习笔记05 - 踢人下线源码解析
  • Few-shot medical image segmentation with high-fidelity prototypes 论文总结
  • 计算机网络综合实验指南
  • 【Rust 精进之路之第14篇-结构体 Struct】定义、实例化与方法:封装数据与行为
  • 【操作系统原理06】虚拟存储器
  • CLion编译器中配置ARM嵌入式开发环境教程
  • 面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?
  • ThreadLocal - 原理与应用场景详解
  • 蓝桥杯 二进制问题 刷题笔记
  • 一个旅行攻略需要调用多少个MCP的服务?
  • 松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)
  • 网工_DHCP协议
  • AI与思维模型【67】——元认知
  • 使用docker任意系统编译opengauss
  • Vue.js 入门教程
  • Spring 微服务解决了单体架构的哪些痛点?
  • 分布式入门
  • 七段码 路径压缩 并查集 dfs
  • 思维题专题
  • K8s-Pod详解
  • 第一讲 生成式ai是什么
  • 头歌java课程实验(函数式接口及lambda表达式)
  • 【AI论文】CLIMB:基于聚类的迭代数据混合自举语言模型预训练
  • 2026《数据结构》考研复习笔记四(第一章)
  • 单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现
  • Java学习手册:Filter 和 Listener
  • synchronized 与分布式锁
  • 约束:常见约束(常见约束-例子,外键约束)