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

状态压缩动态规划学习笔记

本篇文章将从状态压缩入门开始讲起。

什么是状态压缩

假设你面前有 \(n\) 盏灯,每盏灯的状态有:开、关。如何表示这个状态呢?

简单,用个 bool 数组,搞定!

那,如果 \(n\) 非常大,大到数组开不下怎么办呢?

其实很简单,我们把开的状态记为 \(1\),关着的状态记为 \(0\)。那么这一串灯就可以用 \(1\)\(0\) 的二进制表示。再转换成 \(10\) 十进制就可以了。比如十个灯,状态分别为:开关开开关开开关关关,那么就可以表示为 \((1011011000)_2=(728)_{10}\)

这就是状态压缩。十分简单。

然后我们再在其基础上进行 DP 就是所谓的状压 DP 了!

因为涉及到二进制位枚举,所以数据范围一般都在 \(20\) 左右,因为 \(2^{20}\approx 10^6\),差不多就是最大值了。

例题

A:P2622 关灯问题 II

这个题目和我们上面举的例子非常像,所以很容易看出把灯状态压缩。接下来就有两种做法。

做法一

一开始的状态为 \((111\dots 1)_2\),有 \(n\)\(1\)。换成十进制就是 \(2^{n+1}-1\)。我们的目标是 \((000\dots 0)_2=(0)_{10}\),考虑搜索能否到达。用 BFS 搜索,然后就是板子了。时间复杂度 \(O(nm\cdot 2^n)\)

code:

/*
------- INFO -------
> Date:2025/12/27
> Time:09:20:03
> Filename:P2622.cpp
> Path:~/桌面/dhx/P2622.cpp
--------------------
*/
#include <iostream>
#include <queue>
#include <cstdio>
#define int long long
#define endl '\n'
using namespace std;int n,m;
int a[105][15];
bool vis[1<<11];
struct node{int x;//now statusint s;//step
};
void bfs(){queue<node> q;q.push({(1<<n)-1,0});vis[(1<<n)-1] = true;while(!q.empty()){node f = q.front();q.pop();for(int i = 1;i<=m;i++){int now = f.x;for(int j = 1;j<=n;j++){//枚举使用哪个按钮并修改if(a[i][j]==1){now = (now&(~(1<<(j-1))));}if(a[i][j]==-1){now = (now|((1<<(j-1))));}}if(vis[now]) continue;//如果访问过就不再访问vis[now] = true;// cout<<now<<endl;if(now==0){//如果是0,立即退出cout<<f.s+1;exit(0);}q.push({now,f.s+1});}}
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i = 1;i<=m;i++){for(int j = 1;j<=n;j++){cin>>a[i][j];}}bfs();cout<<-1;//否则如果到最后都没有退出,得到结论:无解return 0;
}
http://www.jsqmd.com/news/149399/

相关文章:

  • 【建议收藏】大模型学习全攻略:从数学基础到前沿技术,助你成为AI时代抢手人才
  • 大模型结构化数据流式输出技术详解(附实例)小白到高手进阶,一篇全掌握+赶紧收藏!
  • (Open-AutoGLM全面测评报告)工业级应用首选模型揭晓
  • 油藏开发问题的归纳
  • 短视频矩阵系统源码搭建与定制化开发底层实现
  • 从零搭建AI训练流水线:基于TensorFlow镜像的CI/CD实践
  • 为什么你的Open-AutoGLM部署总是失败?一文定位核心问题根源
  • TensorFlow镜像兼容性全解析:支持多种操作系统与硬件平台
  • 揭秘Open-AutoGLM部署难题:5大常见错误与避坑实战方案
  • Arduino蜂鸣器音乐代码实现原理图解说明
  • 构建鲁棒性强的AI服务:TensorFlow镜像的错误恢复机制
  • 实用指南:基于 Electron 模拟鸿蒙设备硬件信息查询的可行性探索
  • Open-AutoGLM Python聊天机器人开发全解析(从零到上线)
  • Open-AutoGLM提示词调优实战秘籍(专家级技巧大公开)
  • nt!PipProcessStartPhase3函数分析之nt!PipSetDevNodeState
  • 实用指南:SpringBoot Maven快速上手
  • 实用指南:SpringBoot Maven快速上手
  • Open-AutoGLM安卓部署全攻略(从零到上线仅需2小时)
  • 还在为AutoGLM本地运行发愁?专家级解决方案一次性放出
  • 微信立减金回收靠谱平台大揭秘 - 京顺回收
  • 从注册到下单:亚马逊自养号采购技术全链路操作流程
  • Open-AutoGLM在哪里下载?如何确保版本安全与官方验证?
  • 面向企业的AI基础设施:TensorFlow镜像部署指南
  • HackerOne上的CVE-2025-4388重复报告:一次五分钟的漏洞发现之旅
  • 如何用TensorFlow镜像实现自动化的模型版本管理
  • 自然语言处理任务提速秘籍:TensorFlow镜像优化技巧
  • 轻量级部署也能高性能?TensorFlow Lite镜像应用场景解析
  • 自然语言处理任务提速秘籍:TensorFlow镜像优化技巧
  • Open-AutoGLM移动端落地难题,3大关键技术突破揭秘
  • TensorFlow镜像适配最新CUDA驱动,充分发挥GPU性能