关灯问题II 状压DP
2024-10-21 09:56:47
关灯问题II 状压DP
\(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完。
\(n\le 10,m\le 100\)
状压DP的好题,体现了状压的基本套路与二进制操作
注意到此题\(n\)极小,一般小于\(16\)就可以做状压,并且发现每次转移时需要每盏灯的信息,于是我们直接将灯状态塞进二进制即可。
首先我们从初态开始按顺序枚举状态,然后枚举每次状态的决策,最后按题意转移到下一个状态即可。
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAXN 11
#define MAXM 110
using namespace std;
int n,m;
int a[MAXM][MAXN];
int f[1<<10];
int main(){
scanf("%d%d", &n, &m);
int mxf=(1<<n)-1;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
scanf("%d", &a[i][j]);
memset(f, 0x3f, sizeof f);
f[mxf]=0;
for(int i=mxf;i>=0;--i){
for(int j=1;j<=m;++j){
int to=i;
for(int k=1;k<=n;++k){
if(a[j][k]==0) continue;
if(a[j][k]==1 && (to & (1<<(k-1))) ) to=to^(1<<(k-1));
if(a[j][k]==-1 && !(to & (1<<(k-1))) ) to=to^(1<<(k-1));
}
f[to]=min(f[i]+1, f[to]);
}
}
if(f[0]==0x3f3f3f3f) puts("-1");
else printf("%d\n", f[0]);
return 0;
}
最新文章
- HTML5的全新语义化元素
- 基于zepto的移动端日期+时间选择插件
- webpack学习笔记
- BZOJ1212——L语言
- CentOs5.8下安装Oracle12C
- MQTT——安装、测试
- rm排除指定文件或指定文件夹下文件
- SIMPASS技术解析
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
- Mybatis——choose, when, otherwise可以达到switch case效果
- 个人认为一个比较完整,基于tp5平台,可快速开发的B2C平台
- window炫丽cmd的别名cmder
- .NET手记-Autofac进阶(注册的概念 Registering Concepts)
- Oracle sqlplus失去响应解决方法/如何在数据库失去响应时转储状态信息(转)
- vue组件库(二):基于verdaccio工具npm私服搭建
- express4.x Request对象获得参数方法小谈【原创】
- mybatis笔记之使用Mapper接口注解
- .net 4.5如何使用Async和Await进行异步编程
- vue cli 构建的 webpack 项目设置多页面
- beanshell引用参数化数据